【发布时间】:2010-03-04 00:04:01
【问题描述】:
我正在尝试修复一个 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)。这似乎是一个可怕的黑客攻击。
是否有更好的方法来区分特殊字符(例如“&”)和 IE 中的箭头键?
【问题讨论】:
-
我认为它充分说明了 IE,箭头键的 keyCodes 形成了一张愤怒的悲伤脸:%&'((在评论文本输入字体中效果更好)
标签: javascript jquery internet-explorer-7 keypress keycode