<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);
我本来期望这个方法可以防止触发'click'事件,但实际上并没有。然而,将mouseup
更改为mousedown
确实可以阻止点击事件的发生。
我还尝试将useCapture
参数设置为true,但是这也不能产生mouseup
的期望行为。我在Chrome和Firefox上进行了测试。在提交错误之前,我想在这里询问一下。
这是当前浏览器的一个bug,还是已经记录的行为?
我已经查阅了W3C标准(DOM level 2),但我没有找到任何可以解释这种行为的东西,但是我可能错过了什么。
在我的特定情况下,我正在尝试让两个监听同一元素事件的代码片段解耦,我认为在具有优先级的部分中使用捕获事件将是解决此问题的最优雅方式,但是我遇到了这个问题。值得一提的是,我只需要支持官方支持的版本的FF和Chrome(包括FF的ESR)。
preventDefault
和stopImmediatePropagation
(顺便说一下),因为没有<form>
,所以不会通过按钮提交,也没有相同类型的多个事件。我认为这是预期的行为,因为mouseup
在click
之前触发,所以.child
的mouseup
事件会在其click
事件之前触发(并冒泡),尽管你已经停止了它,但这并不重要。 - IanuseCapture
设置为true会强制.wrapper
的mouseup在子元素冒泡之前发生。我没有包含此代码,因为无论哪种情况,我都应该只收到一个alert()(具有不同的起源元素),对吧? - beatgammit