<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上测试了这个。在我提交错误之前,我想我会在这里问。
这是当前浏览器中的错误,还是记录的行为?
我已经查看了W3C standard (DOM level 2),但我无法找到任何可以解释此行为的内容,但我可能错过了一些内容。
在我的特定情况下,我试图解耦两个侦听同一元素上的事件的代码,并且我认为在具有优先级的部分上使用捕获事件将是解决此问题的最优雅的方法,但是然后我遇到了这个问题。 FWIW,我只需要支持官方支持的FF和Chrome版本(包括FF的ESR)。
答案 0 :(得分:3)
Check out this quirksmode article
click
事件:
在同一元素上发生mousedown和mouseup事件时触发。
因此,当释放鼠标单击时,mouseup
和click
事件都会被触发,click
不会等待mouseup
回调完成。几乎所有,mouseup
和click
都可以同义使用。
要取消click
,就像您演示的那样,您可以在false
事件回调中返回mousedown
,以防止click
事件完成。
答案 1 :(得分:1)
正如Joseph Spens所说,取消mousedown将阻止点击事件被触发
function log(msg){
logBox.innerHTML += '<li>' + msg + '</li>'
}
function onMousedown(e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
log(e.type);
return false;
}
function onMouseup(e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
log(e.type);
return false;
}
function onClick(e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
log(e.type);
return false;
}
document.querySelector('.child').addEventListener('mousedown', onMousedown, false);
document.querySelector('.child').addEventListener('mouseup', onMouseup, false);
document.querySelector('.child').addEventListener('click', onClick, false);
var logBox = document.querySelector('.log')
<div class='wrapper'>
<button class='child'>Click me</button>
<ul class="log">
</ul>
</div>
答案 2 :(得分:0)
Sames返回false无效
function log(msg){
logBox.innerHTML += '<li>' + msg + '</li>'
}
function onMousedown(e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
log(e.type);
return false;
}
function onMouseup(e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
log(e.type);
return false;
}
function onClick(e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
log(e.type);
return false;
}
document.querySelector('.child').addEventListener('mousedown', onMousedown, false);
document.querySelector('.child').addEventListener('mouseup', onMouseup, false);
document.querySelector('.child').addEventListener('click', onClick, false);
var logBox = document.querySelector('.log')
<div class='wrapper'>
<button class='child'>Click me</button>
<ul class="log">
</ul>
</div>