当我更新到新的jQuery时,我的对话框抛出错误:无法在对话框之前调用方法

时间:2014-08-28 10:51:09

标签: jquery jquery-ui modal-dialog jquery-ui-dialog

当我更新到新的jQuery(v2.1)和jQuery UI(v1.11)时,我开始收到错误:在初始化之前无法在对话框上调用方法;试图调用方法'关闭' 此外,dialog.dialog停止了覆盖工作。

代码功能:

function ShowPopup(element, restCon, restLay, url) {
$(element).dialog({
    autoOpen: false,
    resizable: false,

    modal: true,
    open: function () {
        dialogs.push(this);
        //other function
    },
    close: function () {
        $(this).dialog('destroy').empty();
        $(this).remove();
        //other function
    },
    width: 250,
    height: 320,
    closeOnEscape: true,
    title: "Show ",
    position: {
        my: "center",
        at: "center",
        of: $("container")
    },
    buttons: [
        {
            text: "Close",
            click: function () {
                $(this).dialog("close");
            }
        }
    ]
  });
  $(element).load(url, function () {
      //other element
  });
}

第二个功能:

function CreatePopup(link, contId, restore, url) {
var target = $(link).not(".details-link");
if (target.length > 0)
{
    target.addClass("details-link");
    target.click(function(){
            ShowPopup(
                '#' + contId,
                restore,
                '<div id="'+ contId +'"></div>',
                url + $(this).attr('data-id')
            );
    });
 }
 }

通话功能:

$(function () {
    var count = '@Model.Count';

    setCountToSubTabjQuery($("#client-projects-@guid").closest(".tabs-  view").find('.tab-link.tab-link-project').children('.number'), count);

    CreatePopup('.project-Name',
                'project-info-details-popup-container-@guid',
                '#containerProject',
                '/Project/Details?id=');
});

HTML:

<div class="details-Item project-Name" data-id="@Model[i].ID">@Model[i].Project</div>

1 个答案:

答案 0 :(得分:0)

您发布的代码不包含实际打开对话框的行,因此我的猜测是您在其他地方执行此操作。这很可能导致错误。

问题是您在.dialog.destroy()函数处理程序中调用.remove()close。该调用会破坏窗口小部件并从DOM中删除HTML元素。但是,HTML元素在内存中仍然存在,因为您在变量myDialog中保存了对它的引用。随后对close的调用将抛出您正在接收的异常(或任何窗口小部件方法)。

这是一个重复问题的小提琴;只需关闭对话框并尝试重新打开它:http://jsfiddle.net/xsspx7d7/

现在,为了解决这个问题:

  • 最简单的解决方法是完全删除变量myDialog,并在任何地方使用选择器$('#add-edit-' + id)。这样,一旦对话框被销毁,选择器就不会匹配任何东西,也不会抛出任何错误。

  • 如果您有机会,更灵活,更有弹性的解决方案是重做对话框的生命周期,并让close处理程序摆脱destroy和{{ 1}}函数调用。