jquery - 为什么我从 jQuery UI 得到 "Uncaught Error: cannot call methods on dialog prior to initialization; attempted to call method ' close'"

标签 jquery ajax jquery-ui

我正在维护一个应用程序,之前没有使用过 jQuery UI。该应用程序使用 jQuery-UI 1.9 和 jQuery 1.8.2

我有一个启动对话框的链接。 对话框中有一个输入字段,其内容被 PUT 到服务器以创建资源。

<div id="addThingDialog" title="Add a thing" class="dialog" style="display:none">
    <input type="text" placeholder="New Thing Name" id="newThingName"/>
</div>

我认为我正确调用了初始化,因为我可以从控制台打开和关闭对话框。并通过单击链接。我的设置是:

 $("#addThingDialog").dialog({
            autoOpen: false,
            draggable: true,
            resizable: false,
            modal: true,
            buttons: {
                Submit: {
                    text: "Submit",
                    'class': 'green',
                    click: saveNewThing
                },
                Cancel: {
                    text: 'Cancel',
                    'class': 'purple',
                    click: function () {
                        $(this).dialog("close");
                    }
                }
            }
        });

saveNewThing 方法如下所示:

function saveNewThing() {
    var name = $('#newThingName').val();

    if (!name) {
        alert('You must provide a thing name');
        return;
    }
    console.log('saving ' + name);
    $.ajax('/api/things/' + name,
        {
            type: "PUT",
            dataType: 'json',
            contentType: 'application/json',
            success: function (result) {
                //now reload the current tab
                $('#addThingDialog').dialog('close');
            },
            error: function (xhr, status, error) {
                console.log(error);
                $('#addThingDialog').dialog('close');
            }
        });
}

但是,当我单击提交按钮时,没有任何反应,并且在控制台中记录了一个错误:“未捕获错误:无法在初始化之前调用对话框上的方法;尝试调用方法“关闭””

错误指向 saveNewThing 中以 $.ajax 开头的行

如果我第二次单击“提交”,则会进行网络调用、创建事物并关闭对话框。

所以我的问题是导致错误的原因以及如何修复它?

提前致谢

<小时/>

哇!感谢@MaVRoSCy 制作了 fiddle 。这让我有信心说我的解决方案应该有效,现在是时候坐下来逐步执行 jQuery 代码了。

这导致我:

$("body").on({
    ajaxStart: function () {
        $(".dialog").dialog('close'); //oh oh!
        $(this).addClass("loading");
    },
    ajaxStop: function () {
        $(this).removeClass("loading");
        resizeDashboard();
    }
});

注释掉行关闭对话框并选择类解决了我的问题。我不太清楚为什么,但我还是很高兴。

感谢@MaVRoSCy - 我知道停下来制作一个简单的问题版本,但忘记了。

最佳答案

我想你一定错过了什么。

这是一个fiddle你的代码并且工作得很好。

我唯一改变的是这个(只是为了进行有效的 Ajax 调用):

$.ajax('http://jsfiddle.net/echo/jsonp/', {

关于jquery - 为什么我从 jQuery UI 得到 "Uncaught Error: cannot call methods on dialog prior to initialization; attempted to call method ' close'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23335262/

相关文章:

jquery - HTML 表格 onChange

javascript - 我怎样才能让我的两个 JavaScript 一起工作?

javascript - input[file] 包裹在 Label 内时不可聚焦

php - 我如何使用 jquery ajax 显示我的所有参数列表

javascript - 如何结合ajax和CORS向另一个域发送json请求

jquery - 如何在打开事件之前隐藏 jquery 对话框?

javascript - 拖动时元素的jQuery UI舍入宽度

jquery-ui - jquery ui Accordion - 多个 Accordion 展开/折叠全部 - 样式问题

javascript - 如何将元件放置在井底?

javascript - 删除元素内句子的一部分