当检测到 pointermove 时,不会针对链接上的鼠标操作触发 pointerup 事件

Posted

技术标签:

【中文标题】当检测到 pointermove 时,不会针对链接上的鼠标操作触发 pointerup 事件【英文标题】:pointerup event does not fire for mouse actions on a link when pointermove has been detected 【发布时间】:2018-09-12 10:15:14 【问题描述】:

如果鼠标在pointerdownpointerup 之间移动,我无法在event.pointerType == 'mouse' 的链接(带有href 属性集的A 标记)上触发pointerup 事件。

我有以下场景:

var lastEvent = false;
var handler = function (e) 
  if (lastEvent != e.type) 
    e.target.innerhtml += e.type + ' with ' + e.pointerType + '<br/>';
    e.target.scrollTo(0, e.target.scrollHeight);
  
  lastEvent = e.type;

document.querySelector('a').addEventListener('pointerdown', handler);
document.querySelector('a').addEventListener('pointermove', handler);
document.querySelector('a').addEventListener('pointerup', handler);
div 
  height: 100vh;
  display: flex;

a 
  height: 60vh;
  width: 75vw;
  margin: auto;
  background-color: red;
  display: inline-block;
  user-select: none;
  touch-action: none;
  overflow-y: scroll;
<div>
    <a href="#"></a>
</div>

如果我按下鼠标按钮,按住它一段时间然后释放它,我会得到这个序列:

    用鼠标向下指针 鼠标指针

但是,如果我按下鼠标按钮,按住它并移动鼠标指针,然后释放它,我会得到这个序列:

    用鼠标向下指针 用鼠标移动指针

问题:pointerup 永远不会触发。

我猜是浏览器中的内置点击或拖动功能(我在 Chrome 中测试过)阻止了 pointerup 事件触发,因为如果在 span 上执行此操作或删除 @ 987654332@ 来自它与此序列一起使用的锚链接:

    用鼠标向下指针 用鼠标移动指针 鼠标指针

此外,它完美适用于触摸驱动PointerEvents

    指针向下触摸 指针通过触摸移动 触摸指针

我猜想在元素上设置一个巧妙的 css 属性来禁用 pointerup 预防。 a pointer-actions: click; 之类的东西,但我找不到。

【问题讨论】:

【参考方案1】:

天啊!基本上,我在问题中陈述了答案。 拖动操作阻止了pointerup 事件的触发。只需在链接元素上添加draggable="false" 属性即可解决此问题。

<a href="#" draggable="false"></a>

概念证明:

var lastEvent = false;
var handler = function (e) 
  if (lastEvent != e.type) 
    e.target.innerHTML += e.type + ' with ' + e.pointerType + '<br/>';
    e.target.scrollTo(0, e.target.scrollHeight);
  
  lastEvent = e.type;

document.querySelector('a').addEventListener('pointerdown', handler);
document.querySelector('a').addEventListener('pointermove', handler);
document.querySelector('a').addEventListener('pointerup', handler);
div 
  height: 100vh;
  display: flex;

a 
  height: 60vh;
  width: 75vw;
  margin: auto;
  background-color: red;
  display: inline-block;
  user-select: none;
  touch-action: none;
  overflow-y: scroll;
<div>
    <a href="#" draggable="false"></a>
</div>

唯一的缺点是draggable 设置为false,所有mousedown-mousemove-mouseup 都会触发click 事件。但这可以通过检查pointerdownpointerup 事件之间clientX/clientY 的差异是否大于一定数量的像素,将其存储在变量中并添加click 事件处理程序来防止在这种情况下运行e.preventDefault(); e.stopPropagation();

【讨论】:

以上是关于当检测到 pointermove 时,不会针对链接上的鼠标操作触发 pointerup 事件的主要内容,如果未能解决你的问题,请参考以下文章

未检测到针对 makemigrations 的更改

防止默认和停止传播不使用pointermove

当 GoogleBot 访问时,“从客户端检测到潜在危险的 Request.Path 值”,但不是通过直接链接

Intellij 在运行时不会检测到代码更改

应用不在后台时无法识别 Firebase 动态链接 (iOS)

添加新迁移时,EF 数据迁移不会检测到更改