Jquery 未捕获错误:无法在初始化之前调用对话框上的方法;试图调用方法';选项';

Jquery 未捕获错误:无法在初始化之前调用对话框上的方法;试图调用方法';选项';,jquery,jquery-ui,Jquery,Jquery Ui,我试图使用jQueryUI对话框来提供一个小弹出窗口,它提供一些关于客户的信息并显示一个表单。除了只在第一次点击时起作用外,一切正常。如果我再次尝试单击同一个按钮或另一个按钮,我会收到错误消息: Uncaught Error: cannot call methods on dialog prior to initialization; attempted to call method 'option' 我已经设法弄明白这与关闭/销毁对话框有关,但我不明白我做错了什么。如果我对部件$(this.

我试图使用jQueryUI对话框来提供一个小弹出窗口,它提供一些关于客户的信息并显示一个表单。除了只在第一次点击时起作用外,一切正常。如果我再次尝试单击同一个按钮或另一个按钮,我会收到错误消息:

Uncaught Error: cannot call methods on dialog prior to initialization; attempted to call method 'option'
我已经设法弄明白这与关闭/销毁对话框有关,但我不明白我做错了什么。如果我对部件
$(this.dialog('destroy')进行注释然后至少对话框可以工作,但我得到了一个不同的错误

Uncaught TypeError: Object Exclude something has no method 'dialog'
我用jQuery-ui-1.9.2尝试了jQuery 1.8.3/1.9.1,我也遇到了同样的问题

这是我设置的:

您需要了解

然后试着这样做:

$('.dialog-edit').on("click", function(){
    $(this).dialog({ .... });
});
在关闭对话框时重试

$('.dialog-close').on("click", function(){
        $(this).dialog("close");
    });

请注意,始终使用类而不是id。这是更好的编辑方式:

我发现了真正的问题

您指的是页面上的所有按钮,而不是明确决定哪些按钮

$('button').click(function() {...});
正在将所有按钮连接到显示的对话框-包括对话框内的按钮

因此,我将一步一步地解决这个问题,在解决这个问题的同时,我还发现了一些代码中的其他问题,这些问题主要是语义问题或错误做法,我也将解决它们

首先,按钮!通过将这些按钮与其他按钮区分开来,换句话说,通过一些共同因素,您可以确保您没有使用错误的按钮

<div class="buttons"> ... </div>
确保我没有对对话框中的按钮进行寻址

这就是我所说的“哑巴圈”:

  • 单击按钮->创建对话框
  • 再次单击关闭按钮->关闭对话框->打开对话框(因为这也是一个按钮)
  • 现在,导致错误的问题是为对话框指定标题的部分:

    .dialog('option', 'title', $(this).attr('title'))
    
    ^在这里,因为按钮是关闭按钮,所以您试图寻址它的标题,而不是“排除”按钮,例如,导致了一个错误——因为这是一个刚刚被丢弃的虚拟按钮!它也没有标题

    这就是为什么错误是指对象排除某些东西,这显然不是一个对象,而是对话框的标题。关闭按钮在关闭/打开阶段之间以某种方式接收到该对象ID

    实际上,destroy()方法将容器从对话框类中解除绑定。换句话说,它删除了该功能

    如果要关闭对话框,请使用close()方法

    编辑:
    只有在不再需要使用对话框时,才能调用destroy()方法。

    当单个页面使用不同版本的
    jquery ui.css
    jquery ui.js
    jquery.js
    时,我遇到了这个问题。为了解决这个问题,我使用了相同版本的Jquery文件

    #对话框编辑是对话框本身,他想将显示的对话框附加到按钮上-此代码永远不会触发Chen是正确的,我已经让该部分工作。按钮工作正常。从不,也从不仅使用类名引用对象。脚本需要遍历整个DOM树来匹配所有匹配项,这非常慢。始终参考选择器的完整路径。如果你绝对需要按类引用,至少提供一个上下文(第二个参数$()),在哪里可以找到类。好的,谢谢$('html body div button.dialog close')。埃里克,这是你吗?是的。我建议在三个“div-div”选择器上使用更多信息。如“div.wrapper div.container div.internal-content”,或您设置的w/e。这只是为了确保它与正确的标记匹配,否则该选择器非常通用,如果在页面上的任何其他位置有类似的结构,则可能会导致问题。所以我不应该破坏对话?但是我仍然得到了错误:
    uncaughttypeerror:objectexclude-something没有方法“dialog”
    。这就是让我困惑的地方。只有当你不想再次使用对话框时,才销毁它。所以,如果你打算在不同的按钮上重复使用它,答案是不,不要破坏它。关闭它将隐藏它,但将其保留在DOM中,销毁它将删除元素,或者同时删除销毁不会对我造成任何错误(AJAX页面上的404除外)。发生了一些奇怪的事情,我正在解决它并返回给您。没问题:)经验法则是,在您的选择器中始终保持特定但灵活。如果你有很多这样的例子,你可以记住,将它们封装在“.buttons”div中可以帮助你重用代码,但也不要太笼统-你不知道什么时候按钮会被生成,甚至是你以后在关闭对话框时添加的,这是关闭过程中发生的事情把事情搞砸了。我想你说得对,我不该称之为毁灭。但是我得到了一个不同的错误:
    uncaughttypeerror:Object没有方法'dialog'
    如果调用destroy(),该对象将不再连接到jqueryui中的dialog类。因此不存在这样的功能。只有在不再使用该对话框时,才应调用destroy()。例如,当你清理一些内存时。请改用close()方法。
    .dialog('option', 'title', $(this).attr('title'))