javascript - 为什么 mouseup 事件不能阻止点击事件

标签 javascript dom-events mouseevent

jsfiddle

<div class='wrapper'>
    <button class='child'>Click me</button>
</div>

function h(e) {
    e.preventDefault();
    e.stopPropagation();
    e.stopImmediatePropagation();
    alert(e.type);
    return false;
}

document.querySelector('.wrapper').addEventListener('mouseup', h, false);
document.querySelector('.child').addEventListener('click', h, false);

我希望这可以防止触发“点击”事件,但事实并非如此。但是,将 mouseup 更改为 mousedown 实际上会阻止点击事件。

我也试过将 useCapture 参数设置为 true,但是这也不会产生所需的 mouseup 行为。我已经在 Chrome 和 Firefox 上测试过了。在我提交错误之前,我想我应该在这里问一下。

这是当前浏览器中的错误,还是记录在案的行为?

我查看了 W3C standard (DOM level 2) ,我找不到任何可以解释这种行为的东西,但我可能漏掉了一些东西。

在我的特殊情况下,我试图解耦监听同一元素上的事件的两段代码,我认为在具有优先级的部分使用捕获事件将是解决此问题的最优雅方法,但是然后我遇到了这个问题。 FWIW,我只需要支持官方支持的 FF 和 Chrome 版本(包括 FF 的 ESR)。

最佳答案

Check out this quirksmode article

点击事件:

Fires when a mousedown and mouseup event occur on the same element.

所以当鼠标点击被释放时,mouseupclick 事件都会被触发,click 不会等待 mouseup 回调完成。 mouseupclick 几乎总是可以同义使用。

为了取消 click,就像你演示的那样,你可以在 mousedown 事件回调中返回 false 以防止 点击事件从完成。

关于javascript - 为什么 mouseup 事件不能阻止点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18342747/

相关文章:

javascript - 循环 li 项并设置变量以在每个 li 项中执行不同的操作

javascript - href 用于下载 Excel 文件

javascript - GMaps v3 : How to cancel mouse scroll events before they scroll map

Javascript 事件冒泡未按预期工作

javascript - 即使鼠标移出,也会触发两次 Mouseenter 事件

javascript - 谷歌折线图中的内存泄漏

javascript - 从选择菜单中的选定选项获取值,并在类似的选定菜单中重复它们 Java Script、PHP

javascript - 如何获取innerHTML的id值?

.net - 录制鼠标中键和滚轮滚动

css - javafx 和 css 代码更改鼠标悬停时的超链接颜色