当我清除div时,设置超时仍然运行

时间:2013-08-12 21:28:31

标签: javascript

我有一个setTimeOut,我已经分配给这样的div:

function update(div,data){
    div._myTimer = setTimeout(function() { update(data);},1);   
}

但由于某种原因,当我从页面中删除div时,超时仍然会运行。

例如,假设我通过以下方式清除div的父级:

parent.innerHTML = '';

这不应该取消我的时间因为div不再出现在DOM中吗?或者我误解了什么。

4 个答案:

答案 0 :(得分:1)

设置超时后不需要div存在。您应该记住超时的参考,并在清除div之前手动清除它。

当您通过设置父项的innerHTML来删除div时,您可以查找将要删除的每个div,并检查它是否设置了_myTimer属性,以及清除计时器的情况。

for (var i=0, ilen=parent.childNodes.length; i<ilen; i++) {
    if (parent.childNodes[i]._myTimer) {
        clearTimeout(parent.childNodes[i]._myTimer);
    }
}

或者如果你以这种方式删除div,你可以直接访问引用:

clearTimeout(div._myTimer);
div.parentNode.removeChild(div);

不使用innerHTML ='',这样您可以更好地控制将要删除的元素

答案 1 :(得分:1)

setTimout方法返回的内容不是定时器运行所需的,它只是一个可以用来停止定时器的句柄。

丢失该句柄只意味着您无法使用clearTimeout方法停止计时器。

答案 2 :(得分:0)

你误会了。从文档中删除div不会清除超时。您必须使用clearTimeout取消它。

答案 3 :(得分:0)

您需要clearTimeout才能执行此操作。你可以尝试这样的事情: -

function update(div,data){
   div._myTimer = setTimeout(function() { update(data);},1);   
 }
function remove_div(event) { 
    // do stuff
    clearTimeout(timerId);
}