鼠標捕獲
我在一個拖放實例中看到,即使鼠標移動到瀏覽器外面,拖放程序依然能夠執(zhí)行,仔細查看后發(fā)現(xiàn)是用了setCapture。 鼠標捕獲(setCapture)是這個程序的重點,作用是將鼠標事件捕獲到當前文檔的指定的對象。這個對象會為當前應用程序或整個系統(tǒng)接收所有鼠標事件。 使用很簡單:
this._Handle.setCapture();
setCapture捕獲以下鼠標事件:onmousedown、onmouseup、onmousemove、onclick、ondblclick、onmouseover和onmouseout。 程序中主要是要捕獲onmousemove和onmouseup事件。 msdn的介紹中還說到setCapture有一個bool參數(shù),用來設置在容器內(nèi)的鼠標事件是否都被容器捕獲。 容器就是指調(diào)用setCapture的對象,大概意思就是: 參數(shù)為true時(默認)容器會捕獲容器內(nèi)所有對象的鼠標事件,即容器內(nèi)的對象不會觸發(fā)鼠標事件(跟容器外的對象一樣); 參數(shù)為false時容器不會捕獲容器內(nèi)對象的鼠標事件,即容器內(nèi)的對象可以正常地觸發(fā)事件和取消冒泡。 而對于容器外的鼠標事件無論參數(shù)是什么都會被捕獲, 可以用下面這個簡單的例子測試一下(ie):
<html> <body onclick="alert(2)"> <div onmousemove="alert(1)">mouseover </div> <script>document.body.setCapture(); </script> </body> </html>
這里的參數(shù)是true,一開始body會捕獲所有鼠標事件,即使鼠標經(jīng)過div也不會觸發(fā)onmousemove事件。 換成false的話,div就可以捕獲鼠標事件,就能觸發(fā)onmousemove事件了。
拖放結(jié)束后還要使用releaseCapture釋放鼠標,這個可以放在Stop程序中:
this._Handle.releaseCapture();
setCapture是ie的鼠標捕獲方法,對于ff也有對應的captureEvents和releaseEvents方法。 但這兩個方法只能由window來調(diào)用,而且muxrwc說這兩個方法在DOM2里已經(jīng)廢棄了,在ff里已經(jīng)沒用了。 不過ff里貌似會自動設置取消鼠標捕獲,但具體的情形就不清楚了,找不到一個比較詳細的介紹,誰有這方面的資料記得告訴我啊。
下面都是我的猜測,ff的鼠標捕獲相當于能自動設置和釋放的document.body.setCapture(false)。 因為我測試下面的程序,發(fā)現(xiàn)ie和ff效果是差不多的: ie:
<html> <body> <div id="aa" onmouseover="alert(1)"> </div> <script> document.body.onmousedown=function(){this.setCapture(false)} document.body.onmouseup=function(){this.releaseCapture()} document.onmousemove=function(){aa.innerHTML+=1} </script> </body> </html>
ff:
<html> <body> <div id="aa" onmouseover="alert(1)"> </div> <script> document.onmousemove=function(){aa.innerHTML+=1} </script> </body> </html>
可惜沒有權威的資料參考就只能猜猜了,還有很多還沒有理解的地方以后再研究拉。
注意ff2下的鼠標捕獲有一個bug,當拖放對象內(nèi)部沒有文本內(nèi)容并拖放到瀏覽器外時捕獲就會失效。 給拖放對象插入一個空文本,例如 <font size='1px'> </font>就可以解決,不過這個bug在ff3已經(jīng)修正了。
出處:藍色理想
責任編輯:bluehearts
上一頁 JavaScript 拖放效果分析 [2] 下一頁 JavaScript 拖放效果分析 [4]
◎進入論壇網(wǎng)頁制作、WEB標準化版塊參加討論,我還想發(fā)表評論。
|