Javascript:捕获鼠标滚轮事件而不滚动页面?

IT技术 javascript scroll mouse mousewheel
2021-02-27 19:04:37

我试图防止页面元素捕获的鼠标滚轮事件导致滚动。

我希望false作为最后一个参数得到预期的结果,但是在这个“画布”元素上使用鼠标滚轮仍然会导致滚动:

this.canvas.addEventListener('mousewheel', function(event) {
   mouseController.wheel(event);
}, false);

在这个“画布”元素之外,滚动需要发生。在里面,它必须只触发.wheel()方法。我究竟做错了什么?

6个回答

您可以通过false在处理程序 (OG) 结束时返回来实现

this.canvas.addEventListener('wheel',function(event){
    mouseController.wheel(event);
    return false; 
}, false);

或使用 event.preventDefault()

this.canvas.addEventListener('wheel',function(event){
    mouseController.wheel(event);
    event.preventDefault();
}, false);

如评论中所指出的,更新为使用现代浏览器已弃用wheel事件mousewheel

问题是关于防止滚动不提供正确的事件,因此请检查您的浏览器支持要求,以选择适合您需要的事件。

使用更现代的方法选项进行了第二次更新。

+1:我遇到了与此完全相同的问题并且return false;工作正常
2021-04-21 19:04:37
@ÁronLőrincz 你可以认为这个问题是“这个事件是否应该冒泡到更多元素?”,在这种情况下答案是错误的。
2021-05-01 19:04:37
我觉得奇怪的是 false 意味着事件被处理。真的会更合乎逻辑...
2021-05-08 19:04:37
mousewheel已被官方弃用以支持该wheel事件:developer.mozilla.org/en-US/docs/Web/Events/mousewheel
2021-05-10 19:04:37
这似乎不再起作用了。@Zeta 的答案是直接在 Chrome 中工作的唯一解决方案。在 Firefox 中,我还必须将(已弃用的)mousewheel事件更改为wheel事件。我添加此评论是为了避免其他人浪费时间,他们可能看不到该答案。
2021-05-13 19:04:37

您是否尝试event.preventDefault()阻止事件的默认行为?

this.canvas.addEventListener('mousewheel',function(event){
    mouseController.wheel(event);
    event.preventDefault();
}, false);

请记住,现在mouswheel不推荐使用wheel,因此您应该使用

this.canvas.addEventListener('wheel',function(event){
    mouseController.wheel(event);
    event.preventDefault();
}, false);
是的,就像 function(event){event.preventDefault(); mouseController.wheel(event)}
2021-04-30 19:04:37
啊,我忘记返回false了。谢谢你的时间!
2021-05-09 19:04:37

只是补充一点,我知道画布只是 HTML5,所以不需要,但以防万一有人想要跨浏览器/旧浏览器兼容性,请使用:

/* To attach the event: */
addEvent(el, ev, func) {
    if (el.addEventListener) {
        el.addEventListener(ev, func, false);
    } else if (el.attachEvent) {
        el.attachEvent("on" + ev, func);
    } else {
        el["on"+ev] = func; // Note that this line does not stack events. You must write you own stacker if you don't want overwrite the last event added of the same type. Btw, if you are going to have only one function for each event this is perfectly fine.
    }
}

/* To prevent the event: */
addEvent(this.canvas, "mousewheel", function(event) {
    if (!event) event = window.event;
    event.returnValue = false;
    if (event.preventDefault)event.preventDefault();
    return false;
});

这种取消似乎在较新的 Chrome > 18 浏览器(以及其他基于 WebKit 的浏览器)中被忽略。要专门捕获事件,您必须直接更改onmousewheel元素方法。

this.canvas.onmousewheel = function(ev){
    //perform your own Event dispatching here
    return false;
};

最后,在尝试了其他一切之后,这奏效了:

   canvas.addEventListener('wheel', (event) => {
    
          // event.preventDefault(); Not Working
          // event.stopPropagation(); Not Working
          event.stopImmediatePropagation(); // WORKED!!
    
         console.log('Was default prevented? : ',event.defaultPrevented); // Says true 
    }, false)