现在,我正在通过鼠标松开来停止拖动事件,如下所示:
$(document).mouseup(_onMouseUp);
不过当鼠标离开浏览器窗口时,我需要捕获鼠标抬起事件,类似于Flash中的releaseOutside
。
在JavaScript中是否可能实现?
现在,我正在通过鼠标松开来停止拖动事件,如下所示:
$(document).mouseup(_onMouseUp);
不过当鼠标离开浏览器窗口时,我需要捕获鼠标抬起事件,类似于Flash中的releaseOutside
。
在JavaScript中是否可能实现?
是的,可以在浏览器窗口外捕获mouseup事件。只需在mousedown回调函数中调用Element.setCapture()即可。
记得在mouseup时也要调用document.releaseCapture()。
elem.addEventListener('mousedown', function() {
...
elem.setCapture();
});
elem.addEventListener('mouseup', function() {
...
document.releaseCapture();
});
mouseup
之前释放捕获,否则不需要使用 releaseCapture
。请参阅 https://developer.mozilla.org/pl/docs/Web/API/Element/setCapture。 - 1j01pointerdown
事件中获取指针 ID,应该将其用于替换 mousedown
。我猜指针 ID 可能是用于多点触控界面的——在我的测试中,它似乎总是为 1。 - Patrick Stephansen您无法在浏览器窗口外部检测到鼠标按下或松开事件,但我认为您想要做的是当用户在浏览器窗口外单击时取消拖放操作。您可以通过对浏览器窗口失去焦点做出反应来实现这一点,例如:
$(window).on("blur", function(e) {
// Cancel my drag and drop here
});
或者
$(document).on("blur", function(e) {
// Cancel my drag and drop here
});
window
而不是 document
,参见 http://www.quirksmode.org/dom/events/blurfocus.html - Ali Shakiba在每个主要的浏览器中,您都可以捕获浏览器窗口外的mouseup事件:Chrome、Edge和Firefox。
您只需要像这样将侦听器附加到“window”对象:
window.addEventListener('mouseup',
() => console.log('mouse up captured outside the window'));
https://codepen.io/fredrikborgstrom/pen/vRBaZw
或者在您的情况下,使用jQuery,它会是这样的:
$(window).mouseup(_onMouseUp);
elem.addEventListener('mousedown', function(e) {
...
elem.setPointerCapture(e.pointerId);
});
elem.addEventListener('mouseup', function(e) {
...
elem.releasePointerCapture(e.pointerId);
});