繁体   English   中英

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

[英]Javascript: Capture mouse wheel event and do not scroll the page?

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

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

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

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

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

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 ,如评论中所指出的,现代浏览器已弃用。

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

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

您是否尝试过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);

只是补充一下,我知道画布只是 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)

为了防止车轮事件,这在 chrome 中对我有用 -

this.canvas.addEventListener('wheel', function(event) {
    event.stopPropagation()
}, true);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM