【发布时间】:2018-04-16 16:22:28
【问题描述】:
下面是一个 JavaScript 文件:
var ToastBtnClicks = 0;
function ShowToast(ToastText){
ToastBtnClicks++;
$('#ToastContainer').append("<div class='ToastContainerChild' id='ToastContainerChild"+ ToastBtnClicks +"'>"+ToastText+"</div><br>");
//document.getElementById("ToastContainer").className = "show";
setTimeout(function(){ $("#ToastContainerChild"+ToastBtnClicks).remove(); }, 2000);
}
每当调用 ShowToast 函数时,都会将一个新的 div 元素附加到元素 #ToastContainer。该过程运行良好。此外,在调用该函数 2 秒后,使用 setTimeOut 方法删除该新元素。我面临的问题是,如果我们多次调用该函数(不等待其余的被删除),并且在几秒钟后如果我们停止连续调用该函数,则只有最后附加的元素被删除(2 秒后)。为什么? 我希望该功能在创建(或附加)后 2 秒从网页中删除所有附加的元素。我该怎么做 ? 抱歉我的英语不好,如果是的话......
【问题讨论】:
-
您有一个名为
ToastBtnClicks的变量,它会被更新,它总是等于最后一个数字。您需要在函数中获取数字的快照,只需创建另一个名为toastNo的变量,并将其设置为ToastBtnClicks并在 setTimeout 回调中使用toastNo。 -
@JJJ:这不是循环中的闭包问题。这只是一场标准的数据竞赛。
-
...纠正自己,这是一个“竞争条件”。 JS 没有数据竞争。
标签: javascript jquery function settimeout