【问题标题】:function inside if statement executing multiple timesif 语句中的函数执行多次
【发布时间】:2017-01-28 17:22:13
【问题描述】:

我有一个容器元素被多次加载,以通过 Ajax 请求在单击事件上显示可变内容,并且在 ajax Complete 时,我调用了一些函数,包括 if 语句中的函数 (A)。

我的问题是当函数 (A) 最终被调用时,它会被多次调用,具体取决于在 if 语句为真之前容器被加载了多少次。

这是我的代码的简单版本:

$(".button").on("click", function(){
  loadContainer();
});

var loadContainer = function(){
  $(".container").load(url, function(){
    var x = $(".x");
    if(x.length>0){
      A();
    };
  });
};

x 是一个元素$(".x"),它将被加载到容器中,并且只有在加载该元素时才应该调用函数 (A)。即$(".x").length>0

如果 (x.length>0) 在容器加载 3 次后为真,则函数 (A) 将被调用 3 次。

有没有办法解决这个问题或确保函数 (A) 只被调用一次??

编辑: 我的完整代码:

    ajaxBtn.on("click", function(e) {

        loadContainer(url, curtain, mainContainer, body, links);
   });
var loadContainer = function(url, curtain, maincontainer, body, links) {

        $(".main-container").load(url + " .main-container  > *", function() {
            $("#logo").css({
                "z-index": "400"
            });

            mainFun();
            curtain.removeClass("full");
            links.removeClass("here");
            body.removeClass("no-scroll");
            clearInterval(timer);
            getFlexIndex();
            position = 0;

            if (vidContainer.length > 0) {
                youTubeLazyLoad();
            }
        });
};

请假设所有变量都已定义。

【问题讨论】:

  • 您的示例非常模糊,其中的变量没有任何意义(Ax),而且您根本没有向我们展示x 变量在哪里被修改。请给我们一个更完整的例子。
  • 我认为您的代码中还有其他未与我们共享的内容。这段代码在我的机器上运行良好,函数A() 在我的机器上触发了一次......
  • 我敢打赌,您不止一次调用按钮单击侦听器。尝试将$(".button").on("click"... 更改为$(".button").off('click').on("click"... 以进行验证。显示的内容不足以让我们进行故障排除
  • 由于我无法在我的机器上重现我的缩小版本的问题,那么问题出在您的代码上,这不是一般问题。您在问题中的这段代码不会重现您提到的问题。除非您的代码中有其他我们在您的问题中没有的内容
  • 没有显示会导致提到的症状。问题在别处。可能多次加载同一个脚本?

标签: javascript jquery


【解决方案1】:

听起来您多次添加相同的按钮点击监听器

您应该研究这是如何发生的,因为没有足够的证据让我们知道原因。它是否嵌入在另一个事件处理程序中?还是在一个被多次调用的函数中?

一种解决方法是在添加新点击侦听器之前删除点击侦听器

改变

$(".button").on("click"... 

$(".button").off('click').on("click"...

【讨论】:

  • 这不会解决我猜的问题。因为他已经检查了$(".x").length > 0,所以如果至少有".x" 元素,那么更多的调用将毫无意义。
  • @ibrahimmahrir $(".x") 的长度如果存在并且事件侦听器被多次应用或函数loadContainer 被多次调用或$(".container").length>1 则无关紧要
  • 但是即使函数loadContainer 被多次调用,检查$(".x").length > 0 将是真的,因此A 永远不会被调用。问题可能是别的东西(隐藏在那个神秘的代码中)。
  • @ibrahimmahrir 逻辑没有意义
猜你喜欢
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2023-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多