在浏览器/窗口之外捕获mouseup事件

Nic*_*nas 3 javascript javascript-events

现在我在鼠标上停止拖动事件,如下所示:

$(document).mouseup(_onMouseUp);

但是,当鼠标离开浏览器窗口时,我需要捕获鼠标向上事件,类似于releaseOutsideFlash.

这可能在JS吗?

Ed *_*tes 9

您无法在浏览器窗口之外检测到mouseup或mousedown事件,但我认为您尝试执行的操作是在用户单击浏览器窗口时取消拖放操作.您可以通过对失去焦点的浏览器窗口作出反应来实现这一点,例如:

$(window).on("blur", function(e) {
    // Cancel my drag and drop here
});
Run Code Online (Sandbox Code Playgroud)

要么

$(document).on("blur", function(e) {
    // Cancel my drag and drop here
});
Run Code Online (Sandbox Code Playgroud)

这包括您在浏览器窗口外点击鼠标,以及Windows Alt + Tab任务切换等内容.


Rez*_*eza 6

可以在浏览器窗口之外捕获鼠标按下事件,如下所示:

elem.addEventListener('mousedown', function(e) {
    ...
    elem.setPointerCapture(e.pointerId);
});
elem.addEventListener('mouseup', function(e) {
    ...
    elem.releasePointerCapture(e.pointerId);
});
Run Code Online (Sandbox Code Playgroud)

参考文献setPointerCapturereleasePointerCapture


小智 5

是的,可以在浏览器窗口之外捕获mouseup事件.只需在mousedown回调中调用Element.setCapture().

记得在mouseup上也调用document.releaseCapture().

elem.addEventListener('mousedown', function() {
    ...
    elem.setCapture();
});
elem.addEventListener('mouseup', function() {
    ...
    document.releaseCapture();
});
Run Code Online (Sandbox Code Playgroud)

  • MDN 推荐使用 [setPointerCapture](https://developer.mozilla.org/en-US/docs/Web/API/Element/setPointerCapture),因为它具有更广泛的浏览器支持。它的工作原理几乎相同,但您必须向它传递一个指针 ID。您可以从 `pointerdown` 事件中获取指针 ID,它应该用来代替 `mousedown`。我猜指针 ID 可能用于多点触控界面 - 从我的测试来看,它似乎总是 1。 (3认同)
  • 仅供参考,Chrome 尚不支持 Element.setCapture() (https://bugs.chromium.org/p/chromium/issues/detail?id=246536) (2认同)
  • 我不知道,但即使它确实如此,elem.setCapture()目前在Chrome中引发异常,因此仍需要一些小心. (2认同)

Fre*_*ond 5

您可以在每个主要浏览器的浏览器窗口外捕获 mouseup 事件:Chrome、Edge 和 Firefox。

您只需要将侦听器附加到 'window' 对象,如下所示:

window.addEventListener('mouseup', 
                         () => console.log('mouse up captured outside the window'));
Run Code Online (Sandbox Code Playgroud)

https://codepen.io/fredrikborgstrom/pen/vRBaZw

或者在您的情况下,使用 jQuery,它将是:

$(window).mouseup(_onMouseUp);
Run Code Online (Sandbox Code Playgroud)