我正在解决一个与jQuery UI小部件相关的非常奇怪的JavaScript行为。
使用的是IE7 (win XP)和jQuery 1.2.6 (是的,这是一个旧版本)。
该小部件是一个组合框,它捕获键盘事件,并对箭头键具有特殊行为。
当我尝试在flexbox输入字段中键入"&"字符时,会出现奇怪的行为。
flexbox有一些类似于以下代码的内容:
//initialization
$myInputElement.keypress($.flexbox.process_key);
$.flexbox.process_key = function process_key(e) {
$.flexbox.flexboxFromInput(this).processKey(e);
return true;
};
//on the flexbox object's prototype:
...
processKey: function processKey(e) {
var mod = 0;
if (typeof (e.ctrlKey) !== 'undefined') {
if (e.ctrlKey) mod |= 1;
if (e.shiftKey) mod |= 2;
} else {
if (e.modifiers & Event.CONTROL_MASK) mod |= 1;
if (e.modifiers & Event.SHIFT_MASK) mod |= 2;
}
...
switch (e.keyCode) {
case 38: // up
this.prevResult();
break;
case 40: // down
if (this.getCtr().is(':visible')) this.nextResult();
else this.flexboxDelay(true);
break;
...etc.
}
}
...
当我加入一个日志记录语句时,我发现按下"&"(Shift+7)会产生三个键盘事件:
INFO: Flexbox> processKey, keyCode=16, ctrl=false, shift=true
INFO: Flexbox> processKey, keyCode=55, ctrl=false, shift=true
INFO: Flexbox> processKey, keyCode=38, ctrl=false, shift=true
显然,keyCode 38既是向上箭头键,也是代表“&”的ASCII代码?
当我写这篇文章时,我意识到可以将按键检测为“shift + 7”(keyCode 55),将其视为“&”键,然后设置某种标志以忽略下一个按键(即38)。这似乎是一种可怕的hack。
有没有更好的方法来区分IE中的特殊字符,例如“&”和箭头键?