jquery ui Dialog:无法在初始化之前调用对话框上的方法

Posted

技术标签:

【中文标题】jquery ui Dialog:无法在初始化之前调用对话框上的方法【英文标题】:jquery ui Dialog: cannot call methods on dialog prior to initialization 【发布时间】:2012-11-11 06:58:37 【问题描述】:

我在 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'

以下是代码:

javascript

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>

知道为什么会发生这种情况吗?

【问题讨论】:

【参考方案1】:

试试这个

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

你也可以这样做:

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

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

【讨论】:

这对我有用。每次我想像这样打开它还是只有第一次打开它时,我是否必须初始化对话框?有很多对话框。有没有办法先设置选项,然后通过按钮打开对话框? 我发现这个解决方案还解决了对话框成功打开,关闭,然后用户尝试再次打开对话框。谢谢@ZOD 给了你+1,因为它也解决了我的问题,但你能解释一下它为什么有效吗? @IgorLacik 我假设 .dialog() 返回一个自身的实例,以便您可以执行链接。因此 .dialog(opt).dialog('open') 实例化一个对话框对象(第一次调用),然后对其执行 'open'。然后我假设调用 $(obj).dialog(opt) 然后调用 $(obj).dialog('open') 将在 jquery 对象上实例化单独的对话框对象,因此第二个不会看到第一个配置选项。如果不深入研究对话代码,很难确定,而且我没有时间这样做:D 我已更新问题以解释您试图解释的内容。【参考方案2】:

如果你无法升级 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 导致性能问题时这样做。可能有其他方法可以解决它,而无需对所有对话框进行全局关闭。

【讨论】:

这对我有用!【参考方案3】:

当我只更新 jquery 库而没有并行更新 jqueryui 库时,我收到了这个错误。我使用 jquery 1.8.3 和 jqueryui 1.9.0。但是,当我将 jquery 1.8.3 更新到 1.9.1 时,我得到了上述错误。当我注释掉有问题的 .close 方法行时,它会抛出一个关于在 jquery 库中找不到 .browser 的错误,该库在 jquery 1.8.3 中已弃用并从 jquery 1.9.1 中删除。所以基本上,jquery 1.9.1 库与 jquery ui 1.9.0 库不兼容,尽管 jquery ui 下载页面说它适用于 jquery 1.6+。本质上,在尝试使用两者的不同版本时存在未报告的错误。如果您使用与 jqueryui 下载捆绑在一起的 jquery 版本,我相信您会没事的,但是当您开始使用不同的版本时,您就会偏离常规并得到这样的错误。所以,总而言之,这个错误来自不匹配的版本(无论如何,在我的情况下)。

【讨论】:

我通过将我的 jquery ui 版本升级到 1.9.2 解决了这个问题,然后它就可以工作了。所以,jquery 1.9.1 和 jquery ui 1.9.2 摆脱了上面的错误。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

所以你用这个:

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

如果您在 Dialog 中打开 MVC Partial View,您可以在索引中创建隐藏按钮和 JQUERY 点击事件:

$("#YourButton").click(function()

   theDialog.dialog("open");
   OR
   theDialog.dialog("close");
);

然后在局部视图 html 中调用按钮触发点击:

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

再见。

【讨论】:

【参考方案6】:

如果想在Dialog初始化或页面准备好后立即打开Dialog,也可以在dialog的options对象中设置参数autoOpentrue

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

因此,您不必调用 `$("#divDialog").dialog("open");

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

【讨论】:

'autoOpen' 默认为真。无需在选项中再次指定。【参考方案7】:

我的情况不同,因为'this'的范围而失败:

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

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

【讨论】:

【参考方案8】:

这也是一些解决方法:

$("div[aria-describedby='divDialog'] .ui-button.ui-widget.ui-state-default.ui-corner-all.ui-button-icon-only.ui-dialog-titlebar-close").click();

【讨论】:

【参考方案9】:

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

【讨论】:

这到底是什么意思? 这解释得不好,但有效。在 MVC 中,我的部分视图上有包含对话框的 div 标签。当我将包含的 div 标签移动到父页面时,对话框正常运行。【参考方案10】:

我只需将 ScriptManager 添加到页面。问题已解决。

【讨论】:

【参考方案11】:

在我的情况下,问题是我在对话框中重置表单数据时调用了$("#divDialog").removeData();

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

我用更具体的删除替换了.removeData(),一切又开始工作了。

【讨论】:

以上是关于jquery ui Dialog:无法在初始化之前调用对话框上的方法的主要内容,如果未能解决你的问题,请参考以下文章

jquery ui dialog 内部使用asp.net控件

如何在打开新对话框之前关闭所有 jquery ui 对话框?

“jquery dialog”对话框的关闭事件都有哪些?

“jquery dialog”对话框的关闭事件都有哪些?

无法在 ui-dialog 中删除自动对焦 [重复]

如何用jquery.ui.dialog加载页面