Javascript 多个引用上的clearTimeout

Javascript 多个引用上的clearTimeout,javascript,jquery,Javascript,Jquery,我有一组复杂的setTimeout()调用,它们会触发一些jQuery动画。 我希望能够在不知道他们的各种裁判的情况下清除他们 这段代码将不起作用-但应该说明我正在尝试做什么 window.ref = []; function doAnimation(i) { $('div').each(function(index) { window.ref.push(setTimeout('foo(index,i)',index*1000)); window.ref.

我有一组复杂的setTimeout()调用,它们会触发一些jQuery动画。 我希望能够在不知道他们的各种裁判的情况下清除他们

这段代码将不起作用-但应该说明我正在尝试做什么

window.ref = [];
function doAnimation(i) {
    $('div').each(function(index) {
        window.ref.push(setTimeout('foo(index,i)',index*1000));
        window.ref.push(setTimeout('bar(index,i)',index*2000));
    });
}
然后用你的手把它们清理干净

clearTimeout(window.ref);
或者用jQuery的方式进行:

$.each(window.ref, function (index, value) { clearTimeout(value); });
或者用jQuery的方式进行:

$.each(window.ref, function (index, value) { clearTimeout(value); });

这是不对的,你应该这样做:

window.ref = [];
function doAnimation(i) {
    $('div').each(function(index) {
        window.ref.push(setTimeout('foo(index,i)',index*1000));
        window.ref.push(setTimeout('bar(index,i)',index*2000));
    });
}
然后像这样清楚:

for(var i=0;i<window.ref.length;i++){    
    clearTimeout(window.ref[i]);
}

for(var i=0;i这是不正确的,您应该这样做:

window.ref = [];
function doAnimation(i) {
    $('div').each(function(index) {
        window.ref.push(setTimeout('foo(index,i)',index*1000));
        window.ref.push(setTimeout('bar(index,i)',index*2000));
    });
}
然后像这样清楚:

for(var i=0;i<window.ref.length;i++){    
    clearTimeout(window.ref[i]);
}

for(var i=0;i我知道这已经有了一个可接受的答案,但仅仅因为这些超时ID在您清除它们之后就一文不值了,我会说:

if (window.ref) while(window.ref.length > 0) clearTimeout(window.ref.pop());

我知道这已经有了一个公认的答案,但仅仅因为这些超时ID在您清除它们之后就一文不值,我会说:

if (window.ref) while(window.ref.length > 0) clearTimeout(window.ref.pop());

也许可以创建一个对象,您可以在其中注册这些设置超时,以及该对象的一个功能,该功能可以清除、存储这些设置超时,或者对它们执行任何需要的操作。一个doAnimation setTimeout“管理器”。您可以设置两个设置超时,而不必设置多个超时,让它们在队列上工作。@FelixKling:或者使用一个间隔来创建一个为该队列上的帧计数。仅供参考,此方法将在
window.ref
数组中累积甚至不需要清除的旧(已激发)计时器ID(因为它们已激发)。或者创建一个对象,您可以在其中注册这些设置超时,以及该对象的一个功能,该功能可以清除、存储这些设置超时,或者对它们执行任何需要的操作。一个doAnimation setTimeout“管理器”。您可以设置两个设置超时,而不必设置多个超时,让它们在队列上工作。@FelixKling:或者使用一个间隔来动画读取该队列上的帧。仅供参考,此方法将在
窗口.ref
数组中累积甚至不需要清除的旧(已激发)计时器ID(因为它们已激发).1表示优雅。然而,我忍不住做了一点小小的改进。我总是对改进感到失望。我想做一些类似的事情。比如
if(!!window.ref&&window.ref.constructor==Array)
,因为最初的问题是明确地说
window.ref=[]
我原以为不需要空值和类型检查。为优雅干杯。:/1。然而,我忍不住做了一点小小的改进。我一直在寻求改进。我想做一些类似的事情。比如
if(!!window.ref&&window.ref.constructor==Array)
,因为最初的问题是明确地说
window.ref=[];
我认为实际上不需要空值和类型检查。干杯: