【问题标题】:JQuery detect widget attached附加的 JQuery 检测小部件
【发布时间】:2014-09-28 14:25:02
【问题描述】:

我有一个带有中等数量的 ajax 请求的 Web 应用程序。

我在头部加载所有 jquery 和 jquery 小部件,然后在关闭 body 标记之前加载我的 base.js。

function baseScripts() {
        $(".open-dialog").click(function (event) {
            event.preventDefault();
            event.stopPropagation();        
            alert("Opening dialog");        
            href = $().buildUrl($(this).attr("href"), "&isAjax=true");        
            $().createDialog(href, "Window Title");        
            return false;
        });

        $("input:hidden.select").each(function () {
                var element = $(this);            
                if (!($("#s2id_" + element.attr("id")).length)) {
                    $(element).select2({
                        // select2 properties...
                    });
                }
            });
        }
}

脚本块在每个 AJAX 请求上加载基本脚本

$(document).ajaxComplete(baseScripts);

问题是在每次 ajax 请求后,它会再次调用基本脚本,并且它们会多次打开对话框并多次附加 select2。

如何检测小部件是否已附加到元素或类中? 在每个 ajax 请求上执行脚本(就像我一样)这是一种不好的做法?

【问题讨论】:

  • 设置标志或数据属性

标签: javascript jquery ajax


【解决方案1】:

ajaxComplete 上重新绑定click 事件和select2 是没有意义的。它们应该是一次性绑定,在这种情况下,您可以这样做:

$(document).ready(function(){
    baseScripts();

    function baseScripts() {
        $(".open-dialog").click(function (event) {
            event.preventDefault();
            event.stopPropagation();

            alert("Opening dialog");

            href = $().buildUrl($(this).attr("href"), "&isAjax=true");

            $().createDialog(href, "Window Title");

            return false;
        });

        $("input:hidden.select").each(function () {
            var element = $(this);

            if (!($("#s2id_" + element.attr("id")).length)) {
                $(element).select2({
                    // select2 properties...
                });
            }
        });
    } 
});

【讨论】:

  • 每个 ajax 请求都无法访问以前包含的脚本,即使在头部或正文关闭之前也是如此。所以我要再次加载还是在每个 ajax 请求上再次调用所有脚本。
  • 发出 ajax 请求不会重新加载您的页面。因此,如果您在进行 ajax 调用之前调用了 baseScripts()(正如我所提到的),那么您的 open-dialogclick 事件绑定和 select2 实例化应该在您的 ajax 调用之后保持不变。
  • 是的,他们会的!问题是如果已经绑定了对话框打开两次!
  • @Trxplz0 听起来问题出在代码的其他地方。你能用你完整的js代码更新你的帖子吗?我想你省略了一些细节。如果它们很多,您可以通过 gmail 的 ihcsim 将它们通过电子邮件发送给我。
  • 我在 html 头部包含所有脚本(jquery、jquery ui、select2),然后在 html 正文关闭之前我只有这段代码。当我执行 ajax 请求时,他们可以访问 jquery 或 select2(插件),除非我再次包含 jquery 或在每个 ajaxComplete 上调用此 baseScripts,这两次绑定点击事件......所以当我点击带有 .open-dialog 类的按钮时打开多个对话框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
相关资源
最近更新 更多