在解决了这个问题和给出的先前答案之后,我发现答案中缺少一些重要的细节。这里最重要的一点是,虽然.dialog("destroy")
确实将 div 恢复到其预初始化状态,但它不会将 div 恢复到其在 DOM 中的原始位置。(BAHDev 的问题首先提到了 UI Dialog 如何移动 div。)这对 Ajax 操作至关重要,应该在 jQuery 文档中阐明 div 位置的更改/非更改(这可以为我节省很多时间)。
如果仅对对话框 div 的内容进行 Ajaxing,那么这种行为可能并不重要,因为您可以轻松地找到并重写 div 内容,无论它位于 DOM 中的哪个位置。但是,如果您的对话框内容与其他对象内联,则将 div 从其原始位置移动可能会导致稍后的 Ajaxing 在原始位置创建另一个 div,从而导致多个具有相同 ID 的 div。
例如,我在一次 Ajax 调用中请求了一个简短的产品列表和一个长的产品列表。短列表进入屏幕,长列表进入隐藏对话框。因为列表是相关的,所以在一次 Ajax 调用中同时获取它们是有意义的。因为 UI Dialog 将长列表移出它被 Ajaxed 放入的容器并将其卡在 HTML 正文的末尾,所以当我请求一个新列表时,我最终得到了两个具有相同 ID 的 div,每个 div 都包含一个不同的长列表-- 一个在 Ajax 容器中,一个在正文的末尾。我认为处理此问题的最正确方法是在 Ajaxing 新列表之前首先完全销毁旧的长列表。(也可以检查 UI Dialog 对象并在代码中移动长列表,但这很麻烦并且还可能丢失 div 属性。)
在测试(jQuery 1.4.4,UI 1.8.10)中,我发现在原始 div 上的工作方式与在 UI Dialog 父 div 上.dialog("destroy")
完全相同。.remove()
也就是说,只有 UI Dialog 包装器 div 被剥离,而原始 div 则保留其原始状态。换句话说,以下每一个都做同样的事情[注意:.empty() 没有明显的效果]:
// Three different ways to destroy just the UI Dialog
// (and leave the original div).
$(".ui-dialog:has(#myDialog)").remove();
$("#myDialog").parents(".ui-dialog").remove();
$("#myDialog").dialog("destroy");
因此,销毁 UI Dialog 包装器和原始 div 的最佳方法似乎是:
// Remove the old dialog and div to make way for a new one via Ajax.
$("#myDialog").dialog("destroy");
$("#myDialog").remove();
如果你想确保销毁所有副本——以防你不小心创建了太多调用太多的副本——.dialog()
你需要在 #id 选择器前面添加一些东西,例如:
// Remove all old dialogs and divs to make way for a new one via Ajax.
$("div#myDialog").dialog("destroy");
$("div#myDialog").remove();
您可以在一行中执行此操作,但您的意图不太明显:
// Remove all old dialogs and divs to make way for a new one via Ajax.
// This technique is not recommended.
$("div#myDialog").parents(".ui-dialog").andSelf().remove();
我在 FF 中测试了所有这些,在 IE8 中测试了其中的一些。