【问题标题】:Jquery fadeOut executes callback over and over again, why is this and how can I prevent this?Jquery fadeOut 一遍又一遍地执行回调,为什么会这样,我该如何防止呢?
【发布时间】:2009-08-05 15:55:23
【问题描述】:

我的方法使一个 div 框淡出,并有一个调用方法的回调......像这样:

function closeWindow(windowIdPrefix, speed) {
    $("#" + windowIdPrefix + "_ViewPanel").fadeOut(speed,
        function() {
            resetWindow(windowIdPrefix);
            numWindowsOpen--;
        }
    );
}

function resetWindow(windowIdPrefix) {
   alert("resetting window");
}

当它执行时(onClick of a button),我在 resetWindow 中有一个警报,以查看它执行了多少次。

它似乎永远执行,但我没有坐在那里足够长的时间关闭警报窗口来找出答案。

我做了一些研究并阅读了 Jquery 文档:

回调(可选)函数
动画完成时要执行的函数,对每个动画元素执行一次

所以我想知道,即使我只是淡出 1 个 div,它是否算作 1.. div 具有的每个子元素加 1?

从技术上讲,它们是动画的,因为内部元素随着外部 div 淡出,但如果你在 firebug 中观看 javascript,只有我淡出的外部 div 会改变不透明度/显示。

如果发生这种情况,我如何确保回调只执行一次?

编辑:这是行 numWindowsOpen--; 我没有在函数之前定义 numWindowsOpen 所以由于某种原因导致调用多次发生......谁能解释为什么会这样?

【问题讨论】:

  • 你能把resetWindow的代码也贴出来吗?
  • 这只是一个警告,但我还是添加了它。
  • 如果你坚持使用 console.log($("#" + windowIdPrefix + "_ViewPanel").length);在 fadeOut 线之前你得到了什么? (或者如果您没有安装 firebug,请发出警报而不是 console.log)
  • 我得到 1... 所以它显然应该只调用一次回调。我想知道为什么它会不断重复这样的回调。
  • 对此不确定。你的代码对我来说看起来不错,所以猜它是看不见的。你能在某个地方发布一个精简版让我看看吗?或者张贴一个拉链?

标签: javascript jquery callback children fadeout


【解决方案1】:

回调应该只为每个匹配选择器的元素调用一次。将警报消息直接放在回调中时,您是否会看到多个警报?

function() {
    alert('Test');
    resetWindow(windowIdPrefix);
    numWindowsOpen--;
}

【讨论】:

  • 加入alert('Test');使测试警报一次(无论淡出是否在那里)。从你写的(没有淡出)resetWindow 函数只执行一次。只有当 fadeOut 在那里时,resetWindow 才会被执行多次
【解决方案2】:

问题是 numWindowsOpen 在那里被递减之前没有被声明......很好的提醒,确保你在去更复杂的tihngs之前寻找简单的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-04
    • 2011-09-12
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2011-10-30
    相关资源
    最近更新 更多