当我使用3个setTimeouts单击一个元素时,我试图实现以下功能:
- setTimeout 1 =等待500毫秒以添加类(将某些内容动画化为100%进度)
- setTimeout 2 =再等待400毫秒,使用css类将该元素动画化为scale(0)
- setTimeout 3 =再等待500毫秒,使用jquery remove()从网格中删除该元素
每当我快速单击另一个元素时,前一个单击元素的setTimeouts就会停止,并在单击时运行,直到您单击另一个元素并执行相同的操作。
x1c 0d1x的数据
再看一下上面的图片,如果我点击第一个元素,setTimeout 1就会运行,如果我点击另一个元素,另外两个setTimeout就会停止并且永远不会运行,但是如果我不点击另一个元素,最后一个点击的元素就可以正常工作。
下面是我的代码。我在这里做错了什么?只有js超时的问题,而不是css/html。
function complete_item_anim(obj) {
obj.find(".orderitemprogressbar_text_status").fadeOut(200);
obj.find(".orderitemprogressbar_text_done").fadeIn(200);
obj.find('.order_item_box').addClass('completed');
}
$(".grid-item").click(function(event) {
elem = $(this);
$(this).find('.oitpb_percent').text('100%');
$(this).find('.oitpb_time').text('0m');
$(this).find('.oitpb_time_group').css('max-width', 0);
$(this).find('.orderitemprogressbar_green').css('width', '100%');
setTimeout(function() {
complete_item_anim(elem);
setTimeout(function() {
elem.find('.order_item_box').addClass("removed");
setTimeout(function() {
elem.remove();
}, 500);
}, 600);
}, 600);
});
字符串
1条答案
按热度按时间zaq34kh61#
问题是你只有一个
elem
变量,如果你点击另一个元素,这个elem
变量被设置为 that 元素,这意味着应该与第一个元素一起工作的setTimeout
回调函数实际上将与第二个元素一起工作。如果你采用最佳实践,不使用隐式声明的变量,而是使用
var
显式定义它们,或者现在更好的let
或const
,这将创建一个作用域为click回调函数的变量,因此该回调函数的每次执行都将有自己的elem
变量,这就是你在这里需要的。这不是你的问题,但你也应该处理多次单击同一个元素的情况。在这种情况下,决定是否取消先前启动的
setTimeout
,或者忽略第二次单击,让那些先前的计时器完成它们的工作,直到完成。