2013-01-18 101 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);