指针事件API不一致

时间:2021-03-03 02:43:29

标签: javascript html pointer-events

当您在 PC 上使用鼠标执行以下一系列交互时:

  • 鼠标左键
  • 鼠标右键
  • 鼠标左键
  • 鼠标右键

报告的事件是:

  • 左下
  • 对了

与预期相反:

  • 左下
  • 右下
  • 向左
  • 对了

您可以在嵌入中进行测试:

const d = (sel) => document.getElementById(sel)
const el = d("container");
el.addEventListener("contextmenu", (ev) => ev.preventDefault());
el.addEventListener("pointerdown", (ev) => {
  d("log").innerHTML += `${ev.button} down
`;
});
document.documentElement.addEventListener("pointerup", (ev) => {
  d("log").innerHTML += `${ev.button} up
`;
});
#container{
  padding: 20px;
  border: black 1px solid;
  user-select: none;
}
<div id="container">Click on me</div>
<pre id="log"></pre>

这是规范中指定的,还是由供应商解释的情况?

我不需要解释为什么这是一个问题,但基本上除非有什么我可以参考的东西清楚地将其指定为预期行为,否则它可能会在未来发生变化(或修复),并且我编写的任何依赖于这种(怪异)行为的代码都会严重崩溃。

更新:

根据规范,据我所知,最新版本位于此处:https://w3c.github.io/pointerevents/

声明,

<块引用>

指针事件不会触发和弦按钮按下(按下另一个按钮而指针设备上的另一个按钮已经按下)重叠的指针向下和指针向上事件。

相反,可以通过检查按钮和按钮属性的变化来检测和弦按钮按下。

虽然这解释了为什么 chorded 事件被吃掉了,从某种意义上说,是的,我可以预期第二个和后续的 chorded 事件不会被传递,它在如何使用这个 API 来获取方面完全没有提供那些事件,例如知道何时按下(或松开)第二或第三和弦按钮。据我从浏览器的实现中可以看出,我们将得到的只是 first-down 和 last-up 按钮的 down 和 up 事件,以及那些按钮,而没有任何可能发生的事件之间。

到目前为止,似乎必须退回到旧的鼠标事件 API 才能获得全貌。

如果您阅读 buttons,您可能会获得某种不完整的状态图,例如pointermove。但是如果鼠标没有在适当的时候移动,就会丢失很多信息。在我看来,这是一个不完整的 API。

0 个答案:

没有答案