jquery 点击其他项目后,多次设置内点击功能取消

2ekbmq32  于 2024-01-07  发布在  jQuery
关注(0)|答案(1)|浏览(190)

当我使用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。

  1. function complete_item_anim(obj) {
  2. obj.find(".orderitemprogressbar_text_status").fadeOut(200);
  3. obj.find(".orderitemprogressbar_text_done").fadeIn(200);
  4. obj.find('.order_item_box').addClass('completed');
  5. }
  6. $(".grid-item").click(function(event) {
  7. elem = $(this);
  8. $(this).find('.oitpb_percent').text('100%');
  9. $(this).find('.oitpb_time').text('0m');
  10. $(this).find('.oitpb_time_group').css('max-width', 0);
  11. $(this).find('.orderitemprogressbar_green').css('width', '100%');
  12. setTimeout(function() {
  13. complete_item_anim(elem);
  14. setTimeout(function() {
  15. elem.find('.order_item_box').addClass("removed");
  16. setTimeout(function() {
  17. elem.remove();
  18. }, 500);
  19. }, 600);
  20. }, 600);
  21. });

字符串

zaq34kh6

zaq34kh61#

问题是你只有一个elem变量,如果你点击另一个元素,这个elem变量被设置为 that 元素,这意味着应该与第一个元素一起工作的setTimeout回调函数实际上将与第二个元素一起工作。
如果你采用最佳实践,不使用隐式声明的变量,而是使用var显式定义它们,或者现在更好的letconst,这将创建一个作用域为click回调函数的变量,因此该回调函数的每次执行都将有自己的elem变量,这就是你在这里需要的。
这不是你的问题,但你也应该处理多次单击同一个元素的情况。在这种情况下,决定是否取消先前启动的setTimeout,或者忽略第二次单击,让那些先前的计时器完成它们的工作,直到完成。

相关问题