RMo*_*sey 8 javascript jquery keycode keypress internet-explorer-7
我正在尝试修复jQuery UI小部件上的一个非常奇怪的javascript行为.IE7(win XP),jQuery 1.2.6(是的,它是旧版本).
小部件是一个组合框,它捕获键盘事件并具有箭头键的特殊行为.
当我尝试在弹性框输入字段中键入"&"字符时,我会遇到奇怪的行为.
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.
}
}
...
Run Code Online (Sandbox Code Playgroud)
当我介绍一个日志记录语句时,我发现按"&"(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
Run Code Online (Sandbox Code Playgroud)
显然,keyCode 38既是向上箭头键又是用于&符号的ASCII码?
当我写这一点,它发生,我认为我可以检测按键为"Shift + 7"(键代码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;
}
Run Code Online (Sandbox Code Playgroud)
希望这对某人有帮助。如果您要重用此代码,则可能需要调整关键字“this”的使用,具体取决于它引用的对象(此处是与 Flexbox 小部件关联的 JavaScript 对象)。
编辑:我更新了这段代码,并删除了之前存在的正则表达式测试,我发现它有问题。
| 归档时间: |
|
| 查看次数: |
2331 次 |
| 最近记录: |