我注意到,在单击期间鼠标从按钮的子元素移动时,<button>
元素中的 onclick
元素不会触发mousedown
事件。换句话说:当mouseup
和{{1}}事件不在同一元素上发生时 - 即使两者都是按钮的子元素。
点击/释放按钮文本的像素时,会发生同样的情况。
澄清我做了测试用例:http://jsfiddle.net/gx9B3/
它在FireFox中运行良好。在Chrome 15和QtWebkit 4.7.1中失败
有解决方法吗?我需要专门针对Webkit的解决方案,因为我的项目仅针对此浏览器。
我可以根据JanKuča(我接受的解决方案)建议的方法解决这个问题。需要进行一些额外的调整,特别是引入计时器以避免双击。看看我在JSFiddle上的全面工作解决方案: http://jsfiddle.net/mwFQq/
答案 0 :(得分:4)
您可以在mousedown
上设置document.body
侦听器(以解决整个页面上的问题)。您将检查mousedown
事件是否来自HTMLButtonElement
(或来自其任何子元素),如果是,则设置mouseup
侦听器(在按钮上,以便它不必冒泡太多),将检查target
事件的mouseup
属性。如果它包含在按钮中且与target
事件的mousedown
不同,则会触发click
这样的事件:
var e = document.createEvent('Events');
e.initEvent('click', true, true);
button.dispatchEvent(e);
(仅对基于WebKit的浏览器执行此操作,以便您不会在其他浏览器中获得多个点击事件。或者您可以调用preventDefault
事件的mousedown
方法,因为它也应该阻止解雇click
事件。)
答案 1 :(得分:0)
您可以尝试添加此CSS样式:
button * {
pointer-events: none;
}
子元素将忽略鼠标事件,点击将来自按钮元素本身。这是一个例子http://jsfiddle.net/Tetaxa/gx9B3/2/
答案 2 :(得分:0)
您也可以通过纯CSS技巧解决它。只需将伪元素放在<button>
上即可覆盖文字:
button {
position:relative;
}
button:after {
position:absolute;
top:0;
left:0;
right:0;
bottom:0;
content:'';
}