经过一些体面的研究和试验/错误,最好/唯一的解决方案似乎在创建您自己的自定义窗体控件。
以下是解决该问题的失败尝试。
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