焦點(diǎn)丟失
一般情況下,鼠標(biāo)捕獲都能正常捕獲事件,但如果瀏覽器窗口的焦點(diǎn)丟失就會導(dǎo)致捕獲失效。 我暫時(shí)測試到會導(dǎo)致焦點(diǎn)丟失的操作包括切換窗口(包括alt+tab),alert和popup等彈出窗體。 當(dāng)焦點(diǎn)丟失時(shí)應(yīng)該同時(shí)執(zhí)行Stop程序結(jié)束拖放,但當(dāng)焦點(diǎn)丟失就不能捕獲mouseup事件也就是不能觸發(fā)_fS。 還好ie有onlosecapture事件會在捕獲失效時(shí)觸發(fā),針對這個(gè)情況可以這樣設(shè)置:
addEventHandler(this._Handle, "losecapture", this._fS);
并在Stop程序中移除:
removeEventHandler(this._Handle, "losecapture", this._fS);
但ff沒有類似的方法,不過muxrwc找到一個(gè)替代losecapture的window.onblur事件,那么可以在Start程序中設(shè)置:
addEventHandler(window, "blur", this._fS);
在Stop程序中移除:
removeEventHandler(window, "blur", this._fS);
那ie也有window.onblur事件,那用window.onblur代替losecapture不就可以省一段代碼了嗎。 接著我做了一些測試,發(fā)現(xiàn)基本上觸發(fā)losecapture的情況都會同時(shí)觸發(fā)window.onblur,看來真的可以。 于是我修改程序用window.onblur代替losecapture,但測試后就出問題了,我發(fā)現(xiàn)如果我用alt+tab切換到另一個(gè)窗口,拖動還可以繼續(xù),但這個(gè)時(shí)候應(yīng)該是已經(jīng)丟失焦點(diǎn)了。
于是我逐一排除測試和程序代碼,結(jié)果發(fā)現(xiàn)如果使用了DTD,那么window.onblur會在再次獲得焦點(diǎn)時(shí)才會觸發(fā)。 大家可以用下面這段代碼測試:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script>window.onblur=function(){alert(1)} </script>
在切換到其他程序后,再切換回來才會觸發(fā)window.onblur,還有幾個(gè)比較怪異的狀況就不說了,反正ie用window.onblur是不理想的了。
默認(rèn)動作
對選擇狀態(tài)的文本內(nèi)容、連接和圖片等進(jìn)行拖放操作會觸發(fā)系統(tǒng)的默認(rèn)動作,例如ie中拖動圖片鼠標(biāo)會變成禁止操作狀態(tài),這樣會導(dǎo)致這個(gè)拖放程序執(zhí)行失敗。
不過ie在設(shè)置了setCapture之后,通過用戶界面用鼠標(biāo)進(jìn)行拖放操作和內(nèi)容選擇都會被禁止。 意思就是setCapture之后就不能對文檔內(nèi)容進(jìn)行拖放和選擇,注意這里的拖放是指系統(tǒng)的默認(rèn)動作,例如ondragstart就不會被觸發(fā)。 不過如果setCapture的參數(shù)是false的話,容器內(nèi)的對象還是可以觸發(fā)事件的(具體看鼠標(biāo)捕獲部分),所以setCapture的參數(shù)要設(shè)成true或保留默認(rèn)值。
而ff的鼠標(biāo)捕獲沒有這個(gè)功能,但可以用preventDefault來取消事件的默認(rèn)動作來解決:
oEvent.preventDefault();
ps:據(jù)說使用preventDefault會出現(xiàn)mouseup丟失的情況,但我在ff3中測試沒有發(fā)現(xiàn),如果各位發(fā)現(xiàn)任何mouseup丟失的情況,務(wù)必告訴我啊。
出處:藍(lán)色理想
責(zé)任編輯:bluehearts
上一頁 JavaScript 拖放效果分析 [3] 下一頁 JavaScript 拖放效果分析 [5]
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評論。
|