在刚刚触发 mousedown 和 mouseup 事件之后,jQuery 是否可以防止执行同一元素上的单击事件。
任何帮助/示例将不胜感激。
在刚刚触发 mousedown 和 mouseup 事件之后,jQuery 是否可以防止执行同一元素上的单击事件。
任何帮助/示例将不胜感激。
有一种尴尬的方法是在鼠标按下时禁用按钮,并在短时间内启用它,比如 100 毫秒。如果 mouseup 在此期间发生,则不会触发 click。
$('#btn').on('click', function() {
alert('clicked')
});
$('#btn').on('mousedown', function() {
var btn = $(this);
btn.attr('disabled', 'disabled');
setTimeout(function() { btn.removeAttr('disabled'); }, 100);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<body>
<button id='btn'>Click me</button>
</body>
在 Chrome 和 Internet Explorer 中,而不是 Firefox,在 mousedown 或 mouseup 处分离和重新附加元素将阻止触发 click 事件。在 Internet Explorer 中,这个技巧不会捕获双击(在 Chrome 中它会)。
但我不会依赖这种奇怪的行为,谁知道它是否会在某个时候改变。此外,请注意分离和重新附加也会对分离元素的子元素产生副作用(iframe 重新加载,文件字段重置,...)。
有一个解决方案:
const COORDS = {
xDown: null,
xUp: null
}
const handleOnMouseDown = e => {
e.preventDefault()
COORDS.xUp = null
COORDS.xDown = e.clientX
}
const handleMouseUp = e => {
e.preventDefault()
COORDS.xUp = e.clientX
}
const handleOnClick = e => {
if (COORDS.xDown !== COORDS.xUp) {
e.preventDefault()
console.log('drag')
} else {
console.log('click')
}
}
const el = document.getElementById('test')
el.addEventListener('mousedown', handleOnMouseDown)
el.addEventListener('mouseup', handleMouseUp)
el.addEventListener('click', handleOnClick)
#test {
padding: 20px;
display: block;
background: #ccc
}
<a href="#" id="test">Link</a>
是的,如果您return false;
在 mouseup 处理程序中应该是可能的,因为在 mousedown 和 mouseup 发生后会触发 onclick。这在常规 javascript 中是可能的,因此它也应该与 jquery 事件处理程序一起使用。
编辑:
从事件处理程序返回一个布尔值实际上应该足以用于事件消费。但是,由于这在浏览器中非常不稳定,您应该使用该功能来手动取消事件冒泡:
event.stopPropagation();
其中 event 是您的事件处理程序接收的参数。