我的應用程序保持行爲不端干擾。刪除越來越多的代碼後,我設法找到了問題的核心,但這對我來說毫無意義。mouseDown事件處理與主要處理
位背景的。我的網頁編輯器應用程序對鍵擊有反應,例如,當按下Alt時,用於調整大小的處理程序將被隱藏。它也對鼠標操作作出反應,用於拖動,調整大小,刪除,繪製選擇框等。當嘗試使用事件處理程序並防止默認行爲時(我不希望Alt將焦點更改爲瀏覽器菜單,既不用鼠標來選擇文本),我發現了一件奇怪的事情。
當我爲keyup
和(並且這些包含preventDefault()
)創建事件處理函數時,它工作正常。但是,當我爲mousedown
添加處理程序時,它也可以工作,但以前的處理程序停止工作。如果我從mousedown
處理程序中刪除preventDefault()
,則一切正常。
這裏是我的JS代碼剝離到最小(或者說創造了驗證問題的目的不是別的地方):
// it works fine with these events
var events = ['keyup', 'keydown'];
// but when mousedown is added, its preventDefault() method somehow breaks keydown and keyup
//var events = ['keyup', 'keydown', 'mousedown'];
var log = document.getElementById('log');
var handler = function(e) {
log.innerHTML = e.type + '<br>' + log.innerHTML;
e.preventDefault();
}
for (var i = 0; i < events.length; i++) {
window.addEventListener(events[i], handler);
}
見的jsfiddle here。
到底爲什麼在mousedown
處理preventDefault()
方法與關鍵事件的干擾?
測試在Chrome和Firefox瀏覽器。
這並不能解釋爲什麼mousedown可以防止關鍵句柄工作,也不能幫助我用'mousedown'解決問題。順便說一句,我沒有抱怨'mousedown'被髮送一次,而'keydown'被重複發送。 – Erlik
經過更長時間的更詳細的測試:更新的答案和更好的解釋。 – Silveraven
好吧,最初我以爲你做了它,但看了一會兒之後,你剛剛做的只是添加一個調用未定義('document.focus === undefined'),拋出異常(檢查控制檯),並防止'e.preventDefault()'不被調用。這顯然沒有解決問題。我太快用upvoting :) – Erlik