IE e.keyCode - Как я могу различить амперсанд и стрелку вверх? - PullRequest
8 голосов
/ 04 марта 2010

Я борюсь с очень странным поведением 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?

Ответы [ 4 ]

3 голосов
/ 04 марта 2010

Вот что я в итоге сделал:

    /*
     * 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' в зависимости от того, к какому объекту он относится (здесь это объект javascript, связанный с виджетом flexbox).

Редактировать: Я обновил этот код и удалил тест регулярных выражений, который ранее находился там, и обнаружил, что он содержит ошибки.

2 голосов
/ 04 марта 2010

Я думаю, keydown может дать вам более надежные данные, чем keypress.

1 голос
/ 04 марта 2010

Я рекомендую использовать эту библиотеку jquery для написания пользовательских обработчиков нажатий клавиш: http://code.google.com/p/js-hotkeys/

Попытка логически различить коды клавиш - это кошмар.

0 голосов
/ 04 марта 2010

клавиша вверх или вниз возвращает код клавиши 55 для '&' и 38 для 'Arrow Up'

...