2015-05-14 93 views
8

我有一個基於HTML5 canvas的Javascript組件需要捕獲和釋放鼠標事件。在控制中,用戶點擊其中的區域並拖動以影響改變。在PC上,我希望用戶能夠繼續拖動到瀏覽器之外,並且如果該按鈕被釋放到窗口之外,畫布可以接收鼠標向上事件。.setCapture和.releaseCapture在Chrome中

但是,根據我的看法,setCapture和releaseCapture在Chrome上不受支持。

是否有解決方法?

回答

13

2009年編寫的一篇文章詳細介紹瞭如何實現跨瀏覽器拖動,即使用戶的光標離開窗口,拖動也將繼續觸發mousemove事件。

http://news.qooxdoo.org/mouse-capturing

下面是文章的基本代碼:

function draggable(element) { 
    var dragging = null; 

    addListener(element, "mousedown", function(e) { 
     var e = window.event || e; 
     dragging = { 
      mouseX: e.clientX, 
      mouseY: e.clientY, 
      startX: parseInt(element.style.left), 
      startY: parseInt(element.style.top) 
     }; 
     if (element.setCapture) element.setCapture(); 
    }); 

    addListener(element, "losecapture", function() { 
     dragging = null; 
    }); 

    addListener(document, "mouseup", function() { 
     dragging = null; 
    }, true); 

    var dragTarget = element.setCapture ? element : document; 

    addListener(dragTarget, "mousemove", function(e) { 
     if (!dragging) return; 

     var e = window.event || e; 
     var top = dragging.startY + (e.clientY - dragging.mouseY); 
     var left = dragging.startX + (e.clientX - dragging.mouseX); 

     element.style.top = (Math.max(0, top)) + "px"; 
     element.style.left = (Math.max(0, left)) + "px"; 
    }, true); 
}; 

draggable(document.getElementById("drag")); 

本文包含發生了什麼事情的一個很好的解釋,但有些情況下,假設知識少的缺口。基本上(我認爲),在Chrome和Safari中,如果您在文檔上處理鼠標移動,那麼,如果用戶單擊並保持鼠標,即使光標離開窗口,文檔也會繼續接收鼠標移動事件。這些事件不會傳播到文檔的子節點,因此您必須在文檔級別處理它。

相關問題