大前端

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

2024-06-06  本文已影响0人  jack钱

问题:

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

event.preventDefault();

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

Unable to preventDefault inside passive event listener invocation

原因:

解决方法:

在页面中新增如下监听
canvas.addEventListener('wheel', rollImg, { passive: false });
如有必要,记得卸载事件
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,
    });
  };
}, []);

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

上一篇 下一篇

猜你喜欢

热点阅读