jQuery UI对话框:无法在初始化之前在对话框上调用方法


101

我在jquery 1.5上有一个对话框很好的应用程序。虽然我有很多.live处理程序,但我将其更改为.on。为此,我必须更新jquery(现在是1.8.3,是jquerui 1.9.1)。

现在,我得到了: Error: cannot call methods on dialog prior to initialization; attempted to call method 'close'

以下是代码:

Java脚本

var opt = {
        autoOpen: false,
        modal: true,
        width: 550,
        height:650,
        title: 'Details'
};

$(document).ready(function() {
$("#divDialog").dialog(opt);
    $("#divDialog").dialog("open");
...    

HTML代码

<div id="divDialog">
<div id="divInDialog"></div>
</div>

知道为什么会这样吗?

Answers:


136

试试这个

$(document).ready(function() {
  $("#divDialog").dialog(opt).dialog("open");
});

您也可以这样做:

var theDialog = $("#divDialog").dialog(opt);
theDialog.dialog("open");

这是因为对话框不是存储在中$('#divDialog'),而是存储在动态创建并由.dialog(opt)函数返回的新div中。


5
这对我有用。每次要像这样或仅第一次打开对话框时,都必须初始化对话框吗?有很多对话框。是否没有办法设置选项的初始名称,然后通过按钮打开对话框?
core-chain.io 2012年

6
我发现该解决方案还解决了“在初始化之前无法在对话框上调用方法;​​尝试调用方法'open'”的错误,该错误是在对话框成功打开,关闭然后用户再次尝试打开对话框时发生的。感谢@ZOD
spadelives 2013年

给您+1,使它也解决了我的问题,但是请您解释一下它为什么起作用?
Igor L.

2
@IgorLacik我假设.dialog()返回自身的一个实例,因此您可以执行链接。因此,.dialog(opt).dialog('open')实例化一个对话框对象(第一个调用),然后对其执行“ open”操作。我假设然后先调用$(obj).dialog(opt)然后再调用$(obj).dialog('open')将实例化jquery对象上的单独对话框对象,因此第二个对象看不到第一个对象配置选项。如果不深入研究对话框代码,就很难确定,而且我还没有时间:D
nealio82

我已经更新了问题,以解释您尝试解释的内容。
JotaBe 2013年

23

如果您无法升级jQuery,则会得到:

Uncaught Error: cannot call methods on dialog prior to initialization; attempted to call method 'close'

您可以像这样解决它:

$(selector).closest('.ui-dialog-content').dialog('close');

或者,如果您控制视图并且知道整个页面上根本不应该使用其他对话框,则可以执行以下操作:

$('.ui-dialog-content').dialog('close');

如果使用closest会导致性能问题,我只建议这样做。可能有其他方法可以解决此问题,而无需对所有对话框进行全局关闭。


10

当我仅更新jquery库而不并行更新jqueryui库时,出现此错误。我正在将jquery 1.8.3与jqueryui 1.9.0一起使用。但是,当我将jquery 1.8.3更新为1.9.1时,出现了以上错误。当我注释掉有问题的.close方法行时,它引发了关于找不到的错误.browser在jquery库中被jquery 1.8.3弃用并从jquery 1.9.1中删除。因此,基本上来说,尽管jquery ui下载页面说它与jquery 1.6+兼容,但jquery 1.9.1库与jui ui 1.9.0库不兼容。本质上,尝试使用两者的不同版本时,存在未报告的错误。如果您使用jqueryui下载随附的jquery版本,我相信您会没事的,但是当您开始使用其他版本时,您会偏离常规并出现类似错误。因此,总而言之,此错误是由于版本不匹配造成的(无论如何我还是这样)。


4
我也通过将jquery ui版本升级到1.9.2解决了这个问题,然后它起作用了。因此,带有jQuery UI 1.9.2的jQuery 1.9.1摆脱了上面的错误。
johntrepreneur 2013年

4

所以你用这个:

var theDialog = $("#divDialog").dialog(opt);
theDialog.dialog("open");

如果您在对话框中打开MVC局部视图,则可以在索引中创建一个隐藏按钮和JQUERY click事件:

$("#YourButton").click(function()
{
   theDialog.dialog("open");
   OR
   theDialog.dialog("close");
});

然后在局部视图html中,您调用按钮触发器,例如单击:

$("#YouButton").trigger("click")

拜拜。


2

如果你想立即打开对话框,当对话框初始化或页面已准备就绪,你还可以将参数设置autoOpentrue在选项对话框中的对象:

var opt = {
        autoOpen: true,
        modal: true,
        width: 550,
        height:650,
        title: 'Details'
};

因此,您不必调用`$(“#divDialog”)。dialog(“ open”);。

对话框对象初始化后,对话框自动打开。


2

新的jQuery UI版本将不允许您在未初始化的对话框上调用UI方法。解决方法是,您可以使用以下检查来查看对话框是否仍处于活动状态。

if (modalDialogObj.hasClass('ui-dialog-content')) {
    // call UI methods like modalDialogObj.dialog('isOpen')
} else {
    // it is not initialized yet
}


0

我只需要将ScriptManager添加到页面即可。问题解决了。


0

在我的情况下,问题在于我$("#divDialog").removeData();作为在对话框中重置表单数据的一部分进行了调用。

这导致我清除了名为的数据结构uiDialog,这意味着该对话框必须重新初始化。

我换成.removeData()了更具体的删除内容,然后一切又开始工作了。


0

我的情况不同,由于“ this ” 的范围而失败:

//this fails:
$("#My-Dialog").dialog({
  ...
  close: ()=>{
    $(this).dialog("close");
  }
});

//this works:
$("#My-Dialog").dialog({
  ...
  close: function(){
    $(this).dialog("close");
  }
});

-1

我收到此错误消息是因为在局部视图而不是父视图上有div标签


1
这到底是什么意思?
AaA

1
这很难解释,但是有效。在MVC中,局部视图上的对话框包含div标签。当我将包含div标记移动到父页面时,对话框正常运行。
Paulj
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.