IE e.keyCode – 如何区分&符和向上箭头?

我正在尝试修复jQuery UI小部件上的一个非常奇怪的javascript行为。 IE7(win XP),jQuery 1.2.6(是的,它是旧版本)。

小部件是一个combobox,它捕获键盘事件并具有箭头键的特殊行为。

当我尝试在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中的箭头键?

这就是我最终做的事情:

  /* * Hack around a wierd behavior in IE where "&%'(" have the same keyCodes * as the arrow keys. */ if (keyCodeIn(e.keyCode, 55, 53, 57) && (mod & 2) && !(mod & 1)) { this.ignoreNextArrowKey = true; } else if (222 === e.keyCode && !(mod & 2) && !(mod & 1)) { this.ignoreNextArrowKey = true; } else if (keyCodeIn(e.keyCode, 38, 37, 39, 40) && this.ignoreNextArrowKey) { this.ignoreNextArrowKey = false; return; } //... function keyCodeIn(keyCode) { for(var i = 1; i < arguments.length; i++) { if (arguments[i] === keyCode) { return true; } } return false; } 

希望这有助于某人。 如果您正在重复使用此代码,则可能必须调整关键字“this”的用法,具体取决于它引用的对象(此处,它是与flexbox小部件关联的javascript对象)。

编辑:我更新了这段代码,并删除了之前存在的正则表达式测试,我发现它是错误的。

我认为keydown可能会给你比keypress更可靠的数据。

我建议使用此jquery库为按键编写自定义处理程序: http : //code.google.com/p/js-hotkeys/

试图从逻辑上辨别键码是一场噩梦。

向上或向下键返回’&’的keyCode为55,’Arrow’返回38