【问题标题】:Uncaught Error: cannot call methods on dialog prior to initialization; attempted to call method 'option'未捕获的错误:无法在初始化之前调用对话框上的方法;试图调用方法“选项”
【发布时间】:2013-07-01 08:42:38
【问题描述】:

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

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 并且遇到了同样的问题。

这是我设置的:http://jsfiddle.net/ycZpQ/

【问题讨论】:

    标签: jquery jquery-ui


    【解决方案1】:

    编辑:我发现了真正的问题。

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

    $('button').click(function() {...});
    

    正在将所有按钮附加到显示的对话框中 - 包括对话框中的

    所以我会一步一步地解决这个问题,在弄清楚这一点的同时,我还发现了您的代码中的一些其他问题,主要是语义或不良做法,我也会解决它们。

    首先是按钮!通过将这些按钮与其他按钮区别开来,换句话说,一些共同因素,您可以确保您不会处理错误的按钮。

    <div class="buttons"> ... </div>
    

    然后:

    $('.buttons').on('click', 'button', function() {
        ...
    });
    

    确保我没有处理对话框内部的按钮。

    这导致了我所说的哑循环:

    1. 单击按钮 -> 创建对话框
    2. 点击关闭按钮 -> 关闭对话框 -> 再次打开对话框(因为这也是一个按钮)

    现在导致错误的问题是您为对话框命名的部分:

    .dialog('option', 'title', $(this).attr('title'))
    

    ^ 在这里,因为按钮是关闭按钮,您试图处理 标题而不是“排除”按钮,例如,导致错误 - 因为那是一个虚拟按钮那只是被丢弃了!它也没有标题!

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

    http://jsfiddle.net/ycZpQ/7/

    关于代码中更多编辑的注释:我对对话框创建的外观进行了一些更改,主要是语义上的,但请注意我是如何定义按钮的 - buttons 对象是一个带有属性按钮的对象,而不是具有属性的按钮对象数组。效率高一点,眼睛也舒服一点。

    【讨论】:

    • 只有一个简短的问题。所以我不应该破坏对话框?但后来我仍然得到错误:Uncaught TypeError: Object Exclude something has no method 'dialog'。这让我很困惑。
    • 只有在您不想再次使用时才销毁对话框。所以,如果你打算将它重用于不同的按钮,答案是否定的,不要破坏它。关闭它将隐藏它但将其保留在 DOM 中,销毁它将完全删除元素
    • 删除销毁不会对我造成任何错误(AJAX 页面上的 404 除外)jsfiddle.net/ycZpQ/3
    • 发生了一些奇怪的事情,我正在解决它并回复你。
    • 没问题 :) 一个经验法则是在选择器中始终保持具体而灵活。如果你会有很多这样的情况,你可以记住将它们封装在一个“.buttons”div中会帮助你重用代码,但也不要太笼统——你不知道按钮什么时候会出现稍后由您生成甚至添加
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      如果你想关闭对话框,你想使用 close() 方法。 Check it out in their doc.

      编辑: 仅当您不再需要使用该对话框时才应调用 destroy() 方法。

      【讨论】:

      • 对话框的关闭是有效的,这是关闭期间发生的事情把事情搞砸了。我认为你对我不应该称之为破坏的部分是正确的。但我得到一个不同的错误:Uncaught TypeError: Object &lt;object name&gt; has no method 'dialog'
      • 如果你调用destroy(),对象将不再与jQuery-UI 中的对话框类挂钩。因此不存在这样的功能。如果您再也不会使用该对话框,则只能调用 destroy()。例如当你清理一些内存时。请改用 close() 方法。
      【解决方案4】:

      你需要阅读.on jquery method

      然后尝试这样的事情:

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

      关闭对话框试试

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

      附:始终使用类而不是 id。这是更好的方法

      【讨论】:

      • #dialog-edit 是对话框本身,他想将显示的对话框附加到按钮上 - 此代码永远不会触发
      • 陈是对的,我已经把那部分工作了。按钮工作正常。
      • 永远不要,永远不要只使用类名来引用您的对象。该脚本需要遍历整个 DOM 树以匹配所有匹配项,这非常慢。始终引用选择器的完整路径。如果你绝对需要按类引用,至少提供一个上下文($() 的第二个参数),在哪里可以找到类。
      • 好的,谢谢! $('html body div div div button.dialog-close').埃里克这是你的意思?
      • 是的。我建议在三个“div div div”选择器上使用更多信息。像“div.wrapper div.container div.inner-content”,或者你已经设置好了。这只是为了确保它匹配正确的标签,否则该选择器非常通用,如果您在页面上的任何其他位置有类似的结构,可能会导致问题。
      猜你喜欢
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 2013-02-10
      • 1970-01-01
      • 2019-10-02
      相关资源
      最近更新 更多