修正しようとしているjQueryUIウィジェットで非常に奇妙なjavascriptの動作と戦っています。IE7(Win XP)、jQuery 1.2.6(はい、古いバージョンです)。
ウィジェットはコンボボックスであり、キーボードイベントをキャプチャし、矢印キーに対して特別な動作をします。
フレックスボックスの入力フィールドに「&」文字を入力しようとすると、奇妙な動作が発生します。
フレックスボックスには次のようなコードがあります。
//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)を押すと3つのキー押下イベントが生成されることがわかります。
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の矢印キーを区別するためのより良い方法はありますか?