首页 > 解决方案 > 在文档外部拖动游览期间右键单击拖动指针事件传递的问题

问题描述

document.documentElement.addEventListener('pointermove', (ev) => {
  const el = document.createElement('DIV');
  el.append([ev.buttons, ev.offsetX, ev.offsetY, ev.movementX, ev.movementY].join(', '));
  document.body.prepend(el);
}, true);
document.documentElement.addEventListener('contextmenu', (ev) => { ev.preventDefault(); });
* {
  user-select:none;
  -webkit-user-select:none;
}
<body>content</body>

请使用上面的“运行代码片段”尝试以下操作:

  1. 在文档中移动鼠标,它会在文档上的任何时候泵送事件
  2. 左键单击从内部开始拖动并向外拖动。无论您是否退出页面,事件都会继续。
  3. 单击鼠标中键拖动,观察到相同的行为。
  4. 右键单击拖动,退出文档导致没有事件传递<--- BUG IN BROWSER?
  5. 右键拖动,离开文档区域前也开始左键拖动(例如,向下鼠标右键,向下鼠标左键,然后按住,向外拖动):再次一切正常
  6. 左键拖动,然后在离开文档区域之前开始右键拖动(例如,鼠标左键,鼠标右键,然后按住,向外拖动):再次出现同样的问题
  7. 不再需要任何测试用例,但是用中鼠标代替左鼠标的行为与 5 和 6 相同

我在 Ubuntu Linux 18.04 的 Chrome 中遇到了这个问题。将发布来自其他浏览器和操作系统的更多测试结果。

总结一下:

当在我的 CAD Web 应用程序中使用鼠标右键来环绕/操纵 3D 相机时,这是一个关键的 UX 问题。

mousemove除了pointermove在通话中启用/禁用捕获模式之外,我还进行了测试,但均addEventListener无济于事。

我希望有一些其他事件可以覆盖或阻止默认以恢复预期的行为,因为由于浏览器限制,我不希望将其重新映射到鼠标中键(已用于不同的 3D 交互) .

标签: javascripthtmlbrowsermouseeventmousemove

解决方案


推荐阅读