如果条件更改,请不要执行 setTimeout

Don't execute setTimeout if condition changes

本文关键字:执行 setTimeout 条件 如果      更新时间:2023-09-26

我有以下代码,当您向下滚动时,它会更改div的类。问题是,如果您滚动得非常快(或者如果我在菜单中放置指向div 的链接),超时函数不仅执行最后一个条件,而且将它们作为一个序列执行。我想做的是,如果条件在函数在超时内发生变化,则跳过函数并检查下一个条件。

  $(document).scroll(function() {    
  var about = jQuery('#hh1').position().top;
  var portfolio = jQuery('#hh2').position().top;
  var services = jQuery('#hh3').position().top;
  var workingprocess = jQuery('#hh4').position().top;
  var clients = jQuery('#hh5').position().top;
  var blog = jQuery('#hh6').position().top;
  var contact = jQuery('#hh7').position().top;
  var scroll = $(this).scrollTop();
  if (scroll >= hh1-90 && scroll < hh3-90 || scroll >= hh5-90 && scroll < hh6-90)
  {setTimeout('$(".div").addClass("MyClass")',3440);}
  else 
  {
  setTimeout('$(".div").removeClass("MyClass")',3440);
  }
  });

setTimeout(...)方法需要一个函数在发生超时时执行。您没有向它发送函数。

setTimeout('$(".div").addClass("MyClass")',3440);

将其更改为

setTimeout(function(){$(".div").addClass("MyClass")},3440);

然后-

您必须存储 setTimeout(...) 方法返回的数字超时 id,并使用它来清除超时clearTimeout(...)

保存超时 ID 如下

timeoutID = setTimeout(function(){$(".div").addClass("MyClass")},3440);

然后使用它来清除计时器。

clearTimeout(timeoutID);

您无需检查是否已发生超时,因为如果发生超时,则指定的函数将被调用,如果没有,则需要清除它。因此,只需在条件更改时清除超时即可。

试试这个:

var addClass = function() {
    $(".div").addClass("MyClass");
}
var removeClass = function() {
    $(".div").removeClass("MyClass");
}
if (scroll >= hh1-90 && scroll < hh3-90 || scroll >= hh5-90 && scroll < hh6-90)
  {
      setTimeout( myClass,3440);
  }
  else 
  {
      setTimeout(removeClass,3440);
  }