首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确整理jQuery对话框

问正确整理jQuery对话框
EN

Stack Overflow用户
提问于 2012-11-27 12:19:36
回答 1查看 90关注 0票数 0

我在使用jQuery的对话框小部件时遇到了一个问题.

我有一个解决方案,但我想知道是否有一个更标准的方法(或者我有错误理解的东西):

背景

我有一个网站,它大量使用AJAX,因为大多数时候只有页面的一部分被更新。页面的一部分包含一些打开对话框的JS。当在这个部分和另一个部分之间切换时,第二次打开对话框时,事情就会变得一团糟。

原因

$el.dialog()从文档层次结构中的原始位置移除将成为弹出窗口($el[0])的DOM元素,并将其追加到文档正文中。然后,当我删除弹出元素的原始父元素时,弹出元素不会被删除。

这就意味着这样做(更改/移除页面的这一部分,然后将其更改回来),所有这些都会导致重复的元素it,这并不令人意外地把对话框小部件弄糊涂了。

解决方案

我想出了一个覆盖$.fn.dialog函数并使用jQuery 特别活动的解决方案。它将侦听器附加到原始父元素上的自定义事件“销毁”,当jQuery删除任何元素时将触发“销毁”事件,监听器对此事件的反应是将弹出元素移除到文档中的任何位置。

下面是:

代码语言:javascript
复制
(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')方法,但将其与页面片段/部分处理挂钩似乎并不特别容易。

EN

回答 1

Stack Overflow用户

发布于 2012-11-27 12:37:55

在这种情况下你可以做我做的事。在创建对话框之前捕获父元素,然后在创建对话框后,将其从DOM中分离出来,并将其重新添加回父元素。

代码语言:javascript
复制
var dlg = $('selector.dialog'),
    dlgParent = dlg.parent();

dlgParent.append(dlg.dialog().detach());

这在处理ASPX表单时特别有效(因为我需要获得回发值的任何服务器端标记都必须保留在表单中)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13584117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档