滚动事件完全不起作用

5

我有一个(相对简单的)问题,而且我正在为它苦苦思考。

这个问题非常简单 - scroll 事件永远不会触发。

我正在编写这个 Angular 项目,所以我尝试了以下方法:

angular.element($window).bind('scroll', ()=> {
    console.log('scroll!');
    if (!scope.scrollPosition) {
      scope.scrollPosition = 0;
    }
    // Alerting for test cause wtf is going on
    scope.boolChangeClass = this.pageYOffset > 600 ? alert(true) : alert(false);
    scope.scrollPosition = this.pageYOffset;
    scope.$apply();
  }
);

但是什么都没发生。(假设$window完好无损,我在使用webpack等工具。)如果我将scroll更改为click,那么这个例子就很好用了。奇怪。

所以我尝试了原生JavaScript!

window.addEventListener('scroll',function(){
  console.log('test')
})

这个尝试在除了我的网站之外的所有其他网站上都有效(我必须承认这很经典)。
那么,有没有人遇到过这种情况并知道发生了什么?
我认为某些其他元素在早期阶段消耗了此事件,因此不允许其冒泡。但这只是一个假设。
希望能够理解这个问题 :)
===编辑===
我已经尝试使用monitorEvents(window)(使用Chrome)查看所有触发的事件,并且我可以看到被触发的每个事件,除了滚动事件...

1
如果使用普通的JS仍然无法工作,您确定窗口实际上正在滚动吗?难道不可能是另一个元素在滚动吗?没有一些可行的代码很难确定。 - Jose Faeti
@JoseFaeti,正如我在帖子中提到的那样,这种事件确实在其他网站上触发。 我同意你的看法,可能不是窗口被滚动了,但是我该如何捕获谁在使用这个事件呢? - Aviad
@JoseFaeti 我看你的猜测相当快 :) 为了一般知识 - 有没有办法看到哪个元素触发了哪个事件? - Aviad
1
其实一切都取决于经验 :) 滚动事件不会冒泡,因此要查看哪个元素正在滚动,您必须将滚动事件处理程序附加到可能的每个元素上,这当然是不切实际的。 - Jose Faeti
1
对于冒泡的事件,您只需将事件处理程序附加到body元素即可。前提是没有其他元素消耗该事件。 - Jose Faeti
显示剩余4条评论
1个回答

5

看起来是body元素在滚动。尝试在控制台中添加以下代码。

document.body.addEventListener('scroll', function() {
  console.log('test');
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接