美文网首页大前端
阻止浏览器默认的滚动事件

阻止浏览器默认的滚动事件

作者: jack钱 | 来源:发表于2024-06-06 15:40 被阅读0次

问题:

项目开发中,有一块canvas画布,画布中滚动鼠标滚轮可以将canvas内的图片放大和缩小,但是在canvas中滚动鼠标滚轮时页面随着一起滚动,影响操作。所以想阻止默认的页面滚动事件
一开始在canvas的onWheel事件中使用

event.preventDefault();

但是不起效果,并且浏览器控制台报错

Unable to preventDefault inside passive event listener invocation

原因:

  • 谷歌浏览器对event.preventDefault()(默认事件阻止)的检测机制变化导致。
  • 老版本中,当用户触发定义的监听事件的时候,浏览器会主动检测对应的handler代码中是否有event.preventDefault(),以便进行默认事件阻止。但是这样做会增加响应时间,用户体验受到影响;所以谷歌改变了这个机制。

解决方法:

在页面中新增如下监听
canvas.addEventListener('wheel', rollImg, { passive: false });
  • 新版本的chrome默认是passive:true;就是让chrome消极的去阻止默认事件,等价于不检测是否阻止默认事件,以达到提升浏览器性能的目的.但在这种情况下如果写了e.preventDefault(),相当于"违约,chrome就会在控制台报错 。
  • 所以我们配置passive: false,这样就可以正常使用e.preventDefault()了
如有必要,记得卸载事件
canvas.removeEventListener('wheel', rollImg, {
   passive: false,
});

页面代码

<canvas
  ref={canvasRef}
  style={{ width: '100%', height: '100%' }}
  // onWheel={rollImg}  // 通过事件绑定,这里就不要了,否则会触发2次
  onMouseDown={onmousedown}
  onMouseMove={onmousemove}
  onMouseUp={onmouseup}
  onMouseLeave={onmouseleave}
  onMouseEnter={mouseenter}
  onDoubleClick={handleDoubleClick}
></canvas>

// 滚动函数
function rollImg(event: any) {
  event.preventDefault();
  dbClickPosition = {
    x: '',
    y: '',
  };
  // 坐标转换
  let canvas = canvasRef.current;
  let pos = windowToCanvas(event.clientX, event.clientY, canvas);
  if (event.deltaY < 0) {
    if (scale < 10) {
      scale *= 2;
      imgX = imgX * 2 - pos.x;
      imgY = imgY * 2 - pos.y;
    }
  } else {
    if (scale > 0.1) {
      scale /= 2;
      imgX = imgX * 0.5 + pos.x * 0.5;
      imgY = imgY * 0.5 + pos.y * 0.5;
    }
  }
  drawCanvasFun();
}


useEffect(() => {
  // 滚动事件,不用onwhell是因为没法阻止默认滚动事件
  const canvas: any = canvasRef.current;
  canvas.addEventListener('wheel', rollImg, { passive: false });
  return () => {
    canvas.removeEventListener('wheel', rollImg, {
      passive: false,
    });
  };
}, []);

参考:阻止默认事件失败的解决办法

相关文章

  • JavaScript 经典实例收集整理

    跨浏览器添加事件 跨浏览器移除事件 跨浏览器阻止默认行为 跨浏览器获取目标对象 跨浏览器获取滚动条位置 跨浏览器获...

  • 移动端页面滚动--解决方法

    案例:微信数钱小游戏 wrap是最外层的盒子; 阻止默认事件(只设置默认事件 有点小问题 无法阻止页面滚动)

  • 阻止默认事件

    e.stopPropagation();//阻止冒泡e.preventDefault();//阻止浏览器的默认事件

  • 阻止默认事件,滚轮事件与滚动事件

    一、阻止默认事件:1.默认事件:浏览器页面有很多行为:左击,右击,双击,滚轮事件。这些都是浏览器的默认自带的事件2...

  • JavaScript事件

    一、默认事件 阻止默认事件,主流浏览器使用preventDefault(),IE8及其以下,设置returnVal...

  • H5任务开发笔记(未)

    遮罩层的获取页面高度 pc端 移动端应加上 阻止浏览器默认滚动行为,即阻止弹出层底部滚动 jq对象和dom对象的转...

  • Day12 默认行为和事件冒泡

    浏览器的默认行为以及阻止浏览器的默认行为(兼容) javascript中的默认行为是指javascript中事件本...

  • js的部分兼容

    1.获取鼠标键值 2.获取页面滚动高度 3.事件兼容 4.阻止冒泡 5阻止默认事件 6事件监听的添加移除 7.事件...

  • 【前端插件】Better-scroll 中 better-scr

    better-scroll 默认会阻止浏览器的原生 click 事件,但是不会阻止 button按钮元素的点击...

  • 你应该知道的兼容写法

    1.滚动条 2.获取样式兼容 3.事件对象兼容 4.阻止事件冒泡兼容 5.阻止默认行为兼容 6.事件监听兼容

网友评论

    本文标题:阻止浏览器默认的滚动事件

    本文链接:https://www.haomeiwen.com/subject/wgwpqjtx.html