2013-01-18 67 views
3

现在我停在了鼠标拖动事件,就像这样:捕获鼠标松开事件/窗口

$(document).mouseup(_onMouseUp);

不过,我需要当鼠标离开浏览器窗口来捕捉鼠标了事件,类似于Flash中的releaseOutside

这是可能的JS?

+1

不,这是不可能的 – Bernhard

+0

键盘/鼠标事件只适用于浏览器集中(除非你是IE浏览器:http://spider.io/blog/2012/12 /互联网浏览器数据泄漏/)。这将是一个巨大的安全漏洞。 –

+0

可以检测到文档失去焦点,正如我在下面的答案中详细说明的那样。这可能会完成OP想要的内容。 –

回答

8

您无法在浏览器窗口外检测到mouseup或mousedown事件,但我认为您要做的是在用户单击浏览器窗口时取消拖放操作。您可以实现这个目标,通过反应到浏览器窗口失去焦点,如:

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

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

这包括你的浏览器窗口外的鼠标点击,还搞什么视窗Alt键+标签任务切换。

+0

我想它应该是'window'而不是'document',请参阅http://www.quirksmode.org/dom/events/blurfocus.html –

+0

我测试过所有5种主要浏览器和几种类型的'document'的设备。但是,随意使用'window',那也可以。 –

4

是的,可以在浏览器窗口外捕获mouseup事件。只需拨打Element.setCapture()内部mousedown回调。

记得在mouseup上也打电话document.releaseCapture()

elem.addEventListener('mousedown', function() { 
    ... 
    elem.setCapture(); 
}); 
elem.addEventListener('mouseup', function() { 
    ... 
    document.releaseCapture(); 
}); 
+1

仅供参考Element.setCapture()在Chrome中不受支持(https://bugs.chromium.org/p/chromium/issues/detail?id=246536) –

+0

是的,但Chrome不会默认捕获鼠标? –

+2

我不知道,但即使是这样,elem.setCapture()当前在Chrome中引发异常,所以仍需要一些注意。 –

0

您可以在各种主流浏览器(Chrome,Edge和Firefox)的浏览器窗口之外捕获mouseup事件。

你只需要附加该侦听到 '窗口' 对象,就像这样:

window.addEventListener('mouseup', 
         () => console.log('mouse up captured outside the window')); 

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

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

$(window).mouseup(_onMouseUp);