我有一个简单的网页,带有
button
和 div
。 button
有一个 click
事件侦听器,单击时会记录到控制台。 div
有一个 pointerdown
事件监听器,它调用 setPointerCapture
来捕获指针事件。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=devicexx-width, initial-scale=1.0" />
<title>play</title>
</head>
<body>
<button id="btn">Test</button>
<div id="div" style="margin-top: 20px; height: 50px; width: 50px; background: red"></div>
<script>
const btn = document.getElementById("btn");
btn.addEventListener("click", () => console.log("btn clicked"));
const div = document.getElementById("div");
div.addEventListener("pointerdown", (e) => {
e.target.setPointerCapture(e.pointerId);
});
</script>
</body>
</html>
在 Firefox 上,当我在
div
上按鼠标,将其拖动到 button
上并在 button
上释放鼠标时,button
的 click
事件会触发。此问题在 Edge、Safari 和 Chrome 上不会发生。
我想知道为什么会发生这种情况?如何防止
click
事件触发?
我尝试在指针向上时手动删除该指针捕获,如下所示:
div.addEventListener("pointerup", (e) => {
e.target.releasePointerCapture(e.pointerId);
});
这没有帮助。
PS:如果你想知道我为什么要阻止它,那是因为它与这个问题有关:https://github.com/radix-ui/primitives/issues/2777.
我相信你已经发现了一个错误。
单击事件是同一元素上的鼠标/指针向下和鼠标/指针向上。
让我们稍微更改一下您的代码。
<!DOCTYPE html><html lang="en"><head>
<title>play</title>
</head><body>
<button id="btn">Test</button>
<div id="div" style="margin-top: 20px; height: 50px; width: 50px; background: red"></div>
<script>
function report( e ) {
console.log( this.tagName, e.target.tagName, e.type );
}
const btn = document.getElementById("btn");
btn.addEventListener( 'click', report );
btn.addEventListener( 'pointerdown', report );
btn.addEventListener( 'pointerup', report );
const div = document.getElementById( 'div' );
div.addEventListener( 'pointerdown', ( e ) => {
console.log( 'DIV', e.target.tagName, e.type );
e.target.setPointerCapture( e.pointerId );
} );
div.addEventListener( 'pointerup', report );
div.addEventListener( 'click', report );
document.body.addEventListener( 'pointerdown', report );
document.body.addEventListener( 'pointerup', report );
document.body.addEventListener( 'click', report );
</script>
</body></html>
上面的代码允许尝试各种事情。例如
它可能与Bugzilla 1610659有关,但这里的测试与该错误不同。这是你的错误。你应该归档。