使用 jQuery 的Dialog小部件时遇到问题...
我有一个解决方案,但想知道是否有更标准的方法(或者我误解了一些东西):
背景
我有一个大量使用 AJAX 的网站,因为大多数时候只更新页面的一部分。页面的一部分包含一些打开对话框的 JS。在该部分和另一个部分之间切换时,第二次打开对话框时事情变得一团糟。
原因
$el.dialog()
从文档层次结构中的原始位置删除要成为弹出窗口 ( $el[0]
) 的 DOM 元素,并将其附加到文档正文中。然后当我删除弹出元素的原始父元素时,弹出元素不会被删除。
这意味着这样做(更改/删除页面的该部分,然后将其更改回来)再次导致重复的元素 ID 毫不奇怪地混淆了对话框小部件。
解决方案
我想出了一个解决方案,它覆盖该$.fn.dialog
函数并利用 jQuery特殊事件。它将一个监听器附加到原始父元素上的自定义事件“destroyed”,当jQuery删除任何元素时触发“destroyed”事件,监听器通过删除弹出元素来响应此事件,无论它现在可能在文档层次结构中的任何位置.
这里是:
(function($) {
$.event.special.destroyed = {
remove: function(o) {
if (o.handler) {
o.handler.apply(this, arguments);
}
}
};
var originalDialogFn = $.fn.dialog;
$.fn.dialog = function(firstArg) {
if (!this.data('dialog') && firstArg != 'destroy' && !this.data('dialogCleaner')) {
this.data('dialogCleaner', true);
var $parent = this.parent();
var $dialogEl = this;
$parent.bind('destroyed', function(e) {
if (this == $parent.get(0)) {
$dialogEl.remove();
}
});
}
return originalDialogFn.apply(this, arguments);
};
})(jQuery);
有没有更好的方法来做到这一点?这似乎是 jQuery 对话框工作方式的一个小缺陷,因为它不是那么容易整理好和通用的。
当然,我知道该dialog('destroy')
方法,但似乎并不容易将其挂钩到我的页面片段/部分处理中。