javascript - 窗口莫名检测到滚动

标签 javascript jquery gsap

我有一个相当简单的函数来检测窗口滚动。当用户停止滚动时触发超时事件 (500ms)。这结束然后听众和超时。然后我将窗口动画化(GSAP)到某个点。动画完成后,监听器将再次启动。有时......再次检测到滚动,因此整个功能被触发两次。请查看控制台以查看发生的情况。

代码在这里:

var timeout;
var onScroll = function() {
  console.log('scrolling...');
  if(timeout) {
    clearTimeout(timeout);
    timeout = null;
  }

  timeout = setTimeout(function () {
    console.log('done scrolling... stop listening...');
    $(window).off( "scroll", onScroll);
    clearTimeout(timeout);
    timeout = null;

    // aniamte scroll
    console.log('start animating scroll...');
    TweenMax.to($(window), 0.1, {scrollTo:{y:500}, onComplete:function(){
      $(window).on( "scroll", onScroll);
      console.log('done animating scroll. Start litening again.');
    }});

  }, 500);
}
$(window).on( "scroll", onScroll);

示例:http://codepen.io/rgbjoy/pen/RGVLBK?editors=0011

这是怎么回事?我应该问量子理论家吗?

最佳答案

看起来您的 onComplete 函数在 scrollTo 补间完成之前被调用。

我将 onScroll 中的控制台日志语句更改为:

console.log('scrolling to ' + window.pageYOffset );

然后我在日志中看到了这个:

"scrolling to 341"
"scrolling to 340"
"scrolling to 338"
"done scrolling... stop listening..."
"start animating scroll..."
"done animating scroll. Start litening again."
"scrolling to 500"
"done scrolling... stop listening..."
"start animating scroll..."
"done animating scroll. Start litening again."

所以“滚动到 500”似乎来自调用 onComplete 方法后的补间完成。

我不确定这个问题的解决方案是什么,因为它似乎是 TweenMax 中的一个错误。

关于javascript - 窗口莫名检测到滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39711783/

相关文章:

javascript - 如何在 Javascript 中的前一个 fetch 调用得到响应后调用另一个 fetch?

javascript - jquery 从另一个复选框控制一个复选框

jQuery qTip 在 jquery-1.4.2 下不起作用?

javascript - jQuery if 多个 .val 下拉值的条件

javascript - TweenMax GSAP 没有动画,只能在 codepen 中使用?

angular - ng build --prod = 无法设置未定义的属性 '_autoActivated'

jquery - Parallax 在 Firefox 和 ie 中不起作用

javascript - 绑定(bind)与 html 组件中显示的属性不同的属性

javascript - 等待上一个异步函数完成

javascript - 您如何为选择字段重新填充动态生成的选项?