Javascript 识别window.scroll事件(当它由用户或事件执行的代码触发时)

Javascript 识别window.scroll事件(当它由用户或事件执行的代码触发时),javascript,angular,typescript,ecmascript-6,Javascript,Angular,Typescript,Ecmascript 6,我们是否有办法确定window.scroll事件是由用户鼠标触发的,还是通过调用某个事件的函数触发的。 我使用的是ES6,带角度的打字脚本 我确实看到这个问题在过去与jQuery相关的时候被问过,下面粘贴的建议的解决方案现在已经不起作用了e.originalEvent始终存在,无论滚动如何触发 $('#scroller').scroll(function(e) { if (e.originalEvent) { console.log('scroll happen manu

我们是否有办法确定
window.scroll
事件是由用户鼠标触发的,还是通过调用某个事件的函数触发的。 我使用的是ES6,带角度的打字脚本

我确实看到这个问题在过去与jQuery相关的时候被问过,下面粘贴的建议的解决方案现在已经不起作用了
e.originalEvent
始终存在,无论滚动如何触发

$('#scroller').scroll(function(e) {
    if (e.originalEvent) {
        console.log('scroll happen manual scroll');
    } else {
        console.log('scroll happen by call');
    }
});

您可以使用鼠标滚轮事件
滚轮
,检测滚动是否由鼠标启动

但是,这仅限于当用户滚动鼠标滚轮,同时光标位于相关容器内时,不会解决用户抓住并移动滚动条或通过向上或向下按键触发滚动时的问题

一种更好的方法是反转中的
isWheel
标志在下面代码段中的处理方式,并使用
isNotWheel
标志,该标志由那些通过编程触发并滚动容器内容的处理程序设置/取消设置

请注意,示例中使用了
定时器
设置/清除超时
来充分支持Frefox,它仅在鼠标滚动开始时发出一次滚轮事件,而Chrome在滚动运动期间同时发出滚轮事件和滚动事件

$(()=>{
const main=document.getElementsByTagName('article')[0];
常量a=document.getElementsByTagName('a')[0];
让isWheel=false;
设定时器为空;
$(主)。滚动(e=>{
清除超时(计时器)
计时器=设置超时(()=>{
isWheel=false;
}, 100);
如果(isWheel){
log(“鼠标滚轮触发的滚动”);
}否则{
log(“鼠标滚轮未触发滚动”);
} 
});
main.addEventListener('wheel',e=>{
isWheel=true;
});
$(a)。单击(e=>{
main.scrollTo(0,0);
});
})
.main{
高度:150像素;
溢出y:滚动;
}


是以编程方式触发滚动事件的函数。如果是,那怎么办?通过使用jquery动画或其他工具。@localhost是,函数是我的。当用户单击某个链接时,我启动该功能并滚动到与该链接相关的特定部分。我正在使用“windows.location.hash”进行此操作。不使用jQuery。