3

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

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

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

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

parent.innerHTML = '';

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

4

4 回答 4

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 = '',这样您就可以更好地控制将被删除的元素

于 2013-08-12T21:30:18.650 回答
1

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

丢失该句柄仅意味着您不能使用该clearTimeout方法来停止计时器。

于 2013-08-12T21:33:11.350 回答
0

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

于 2013-08-12T21:30:50.747 回答
0

你需clearTimeout要这样做。你可以尝试这样的事情: -

function update(div,data){
   div._myTimer = setTimeout(function() { update(data);},1);   
 }
function remove_div(event) { 
    // do stuff
    clearTimeout(timerId);
}
于 2013-08-12T21:31:51.513 回答