Я борюсь с очень странным поведением javascript в виджете jQuery UI, который пытаюсь исправить.
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.
}
}
...
Когда я ввожу оператор записи в журнал, я обнаруживаю, что нажатие «&» (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 для амперсанда ?? ?? 1013 *
Когда я писал это, мне пришло в голову, что я могу определить нажатие клавиши как «shift + 7» (keyCode 55), чтобы рассматривать его как клавишу амперсанда, а затем установить какой-то флаг, чтобы игнорировать следующее нажатие клавиши (которое это 38). Это похоже на ужасный хак.
У кого-нибудь есть лучший способ различать специальные символы, такие как "&" и клавиши со стрелками в IE?