Javascript 如何停止setTimeOut

Javascript how to stop setTimeOut

你好 我 运行 遇到了一个小问题,我不知道如何在它到达我的网络上的某个 Y 位置时停止我的添加功能,有人可以帮助我吗!!

var scroll = function(){
 
 var positionYTop = 0,

  speed = 50,
  links = document.getElementsByTagName('a');

 function timer() {
  var clock = setTimeout(add, 200)
 }

 function add() {
  window.scrollTo(0, positionYTop += speed);
  timer();
 }

 add();
}

不清楚您要用您的特定代码做什么,但停止计时器的一般答案是您将 setTimeout() 的结果保存到一个足够高的变量中作用域或对象的 属性,您稍后可以访问它,然后使用它来调用 clearTimeout()。这将停止计时器。

在您当前的代码中,变量 clock 仅对 timer() 函数而言是局部的,因此一旦该函数完成,它将超出范围并且无法访问。您可能需要将 clock 变量移动到更高的范围,以便从您想要停止计时器的任何代码访问它。


或者,如果您要问的问题是如何告诉您的 add() 函数在达到某个位置时停止发出新的 timer() 调用,那么您只需添加一个if() 声明您的 add() 函数,如果满足某些条件则不再调用 timer()

例如:

function add() {
    window.scrollTo(0, positionYTop += speed);
    if (window.scrollTop < 400) {
        timer();
    }
}

一个常见的方法是先设置滚动,然后在另一个方向上 transform/translateY 来抵消滚动的影响,然后将变换向下过渡到零。

基本上,在这个时代,我们希望 browser/CSS 进行过渡。代码少,使用transform会更流畅

这是一个非常粗略的想法(未经测试,您将需要尝试一下):

body.start {
  transform: translateY(-400px);
}

body.transitioned {
  transform: translateY(0);
  transition: transform 1s;
}

function scroll() {
  document.body.scrollTop; = 400;
  document.body.classList.add('start');
  setTimeout(function() { document.body.classList.add('transitioned'); }, 100);
}