經過一些體面的研究和試驗/錯誤,最好/唯一的解決方案似乎在創建您自己的自定義窗體控件。
以下是解決該問題的失敗嘗試。
http://jsfiddle.net/CoryDanielson/4jBgs/10/
這裏的基本上它是如何工作的。
首先,有一個變量activeInput
存儲該輸入的DOMElement
用戶被聚焦。 (僅當輸入是允許脫離)
var activeInput = false;
爲了填充這個變量,我創建你提到可以escaped
(文本框與自動完成,選擇元素)
var escapableElements = [];
escapableElements = escapableElements.concat(
Array.prototype.slice.call(document.getElementsByTagName('select')),
Array.prototype.slice.call(document.getElementsByTagName('input'))
//add more elements here
);
的DOMElements的陣列
然後通過該陣列環路,並附加eventListeners
爲focus
和blur
(失去焦點)事件。 (ⅰ包括在這篇文章的底部各功能)
forEach(escapableElements, function() {
this.addEventListener('focus', registerActiveElement);
this.addEventListener('blur', deregisterActiveElement);
});
function registerActiveElement() {
if (!activeInput)
activeInput = this;
//console.log('registered'); //testing only
}
function deregisterActiveElement() {
if (activeInput)
activeInput = false;
//console.log('deregistered'); //testing only
}
之後,我有線了一個eventListener
爲事件。裏面的,我檢查,看看是否有一個activeInput
如果有,我只是return true;
這將讓瀏覽器做就是了(從自動完成逃避等等)如果沒有一個activeInput
,我檢查是否ESC
被按下,並且致電hide_dialog_box(event.keyCode);
與您的問題中有關處理ESC
按鍵的段落唯一的區別是我檢查是否有activeInput
預先。如果有activeInput
,我什麼都沒做(讓瀏覽器本地處理ESC),如果沒有activeInput
我叫event.preventDefault()
這將取消瀏覽器的ESC本機處理,然後調用函數hide_dialog_box(keyCode)
,然後做return false;
這也有助於防止瀏覽器從處理ESC
按鍵。
document.addEventListener('keydown', function(event) {
if (!activeInput) {
if (event.keyCode == 27) { //esc
event.preventDefault();
hide_dialog_box(event.keyCode);
return false;
}
} else {
return true; //if active input, let browser function
}
/*
if the browser prompts with an autocomplete menu for
<input type="text">, or options on a <select> drop down
pressing escape will cancel that, not cancel the dialog.
*/
});
代碼的最後2個snippits是功能hide_dialog_box(keyCode)
和我寫的函數通過NodeList
稱爲escapableElements
function hide_dialog_box(keyCode) {
var dialog_box = document.getElementById('dialog_box');
dialog_box.style.display = 'none';
}
function forEach(list, callback) {
for (var i = 0; i < list.length; i++)
{
//calls the callback function, but places list[i] as the 'this'
callback.call(list[i]);
}
}
我在工作的東西遐寫信給循環。當你關注某些HTML元素時,你需要將它們註冊爲活動狀態,並且當你點擊轉義時,你需要查看是否有任何元素是「活動的」,如果是的話,允許轉義行爲本身,否則關閉對話框 – 2012-04-16 17:58:44