多次调用同一JavaScript函数会停止前一个相同的函数
下面是一个JavaScript文件:多次调用同一JavaScript函数会停止前一个相同的函数,javascript,jquery,function,settimeout,Javascript,Jquery,Function,Settimeout,下面是一个JavaScript文件: var ToastBtnClicks = 0; function ShowToast(ToastText){ ToastBtnClicks++; $('#ToastContainer').append("<div class='ToastContainerChild' id='ToastContainerChild"+ ToastBtnClicks +"'>"+ToastText+"</div><br>");
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);
}
var toastbtcicks=0;
函数ShowToast(Toast文本){
toastbtcnicks++;
$(“#toast容器”)。追加(“+toast文本+”
”);
//document.getElementById(“ToastContainer”).className=“show”;
setTimeout(函数(){$(“#ToastContainerChild”+toastbtclicks.remove();},2000);
}
每当调用showtoos函数时,都会将一个新的div元素附加到元素#toast container。这一过程正在完美运作。另外,调用函数2秒钟后,使用setTimeOut方法删除新元素。我面临的问题是,如果我们多次调用该函数(而不等待其余的被删除),并且在几秒钟后如果我们停止连续调用该函数,则只有最后附加的元素被删除(2秒后)。为什么?
我希望该功能删除网页中的所有附加元素,在创建(或附加)后2秒。我该怎么做?
很抱歉我的英语不好,如果是…请创建一个局部变量来引用用于创建的元素的索引,这样就可以确定删除了正确的索引。这是必需的,因为您的计数器是共享的,因此如果在两秒钟内单击,计时器将引用递增的值,而不是原始值
var ToastBtnClicks = 0;
function ShowToast(ToastText){
var x = ++ToastBtnClicks; // Notice the prefix ++
$('#ToastContainer').append("<div class='ToastContainerChild' id='ToastContainerChild"+ x +"'>"+ToastText+"</div><br>");
setTimeout(function(){ $("#ToastContainerChild"+x).remove(); }, 2000);
}
var toastbtcicks=0;
函数ShowToast(Toast文本){
var x=++toastbtcicks;//注意前缀++
$(“#toast容器”)。追加(“+toast文本+”
”);
setTimeout(function(){$(“#ToastContainerChild”+x).remove();},2000);
}
无论如何,引用新元素可能更有意义。那么你不需要ID,假设这是它的唯一用途
function ShowToast(ToastText){
var el = $("<div class='ToastContainerChild'>"+ToastText+"</div><br>");
el.appendTo('#ToastContainer');
setTimeout(function(){ el.remove(); }, 2000);
}
函数showtoos(toast文本){
var el=$(“”+ToastText+“
”);
el.附录(“#toast container”);
setTimeout(函数(){el.remove();},2000);
}
请注意,这也将删除
元素,我认为这是需要的。否则请执行el.first().remove()
可能的重复。如果有一个名为toastbtcnicks
的变量,该变量将被更新,它将始终等于最后一个数字,。您需要函数中数字的快照,只需创建另一个变量,例如,toastNo
,并将其设置为toastbtcicks
,然后在setTimeout回调中使用toastNo
。@JJJ:这不是循环中的闭包问题。这只是一场标准的数据竞赛……为了纠正我自己,这是一场“竞赛条件”。JS没有数据竞争。感谢您最快的回复。我还没有试过,但我相信它会成功的。我的大脑没有你的快。现在我明白了。再次感谢。您新编辑的答案更有帮助。非常感谢。很高兴它有帮助。