jquery - событие - управление стрелками js




Какова теория jQuery keypress, keydown, keyup black magic(на Mac)? (2)

Я смущен о различных способах нажатия клавиш , keydown и keyup . Кажется, что я пропустил важную часть документации, которая объясняет тонкости и нюансы этого трио. Может ли кто-нибудь помочь мне выяснить, какой документ мне нужно прочитать, чтобы более эффективно использовать эти события? Если вам нужны детали, см. Ниже.

@ov: вы попросили меня показать какой-то код, но это не проблема в коде, который я пытаюсь решить. Я пытаюсь разобраться с поведением этих обработчиков событий и просить кого-то, кто их понимает, указать мне хорошую документацию.

Я использую jQuery для создания входной формы и вставки ее в свой документ. Он работает отлично, в основном. Я хочу, чтобы форма реагировала на клавиатуру, как и большинство других форм ввода, которые я вижу там: ключ esc должен отклонять форму так же, как нажать кнопку отмены, и потому что форма имеет <textarea> на ней, cmd + enter следует быть таким же, как нажать кнопку « ОК» . Кажется достаточно простым, чтобы использовать событие keypress . Проблема в том, что Chrome не вызывает мой обработчик нажатия клавиши esc или cmd + enter . Он запускается для ctrl + enter и option + enter и для alphanumerics, но не cmd + enter .

Поэтому я буду использовать keyup вместо этого. Я получаю keyup для esc и keyup для cmd и keyup для ввода , отлично. Но я не получаю keyup для ключа ввода, пока я удерживаю CMD .

В третий раз это очарование, вы можете подумать, что keydown, похоже, работает, но с keydown вы получаете ключи повтора. Я знаю, все, что вам нужно сделать, это отвязать обработчик при первом вызове, но кажется странным, что три разных типа событий будут вести себя по-другому. Почему это? Есть ли очевидный документ, который я, очевидно, не читал?


Вы должны помнить, что при проверке KeyboardEvent на mac, ключ модификатора will не будет выбран как event.ctrlKey а скорее event.metaKey . Дополнительная документация доступна на MDN .

Не видя никакого кода, моя ставка заключается в том, что это причина, по которой ⌘+Enter не подбирается.


Эта статья - хороший ресурс, объясняющий различия между keyup , keydown и keypress .

Короткий ответ - нет простого способа справиться с ними, кроме как учитывать разные браузеры.

Как я лично справляюсь с этим в плагине Bootstrap, который я написал, это создание настраиваемого метода для проверки того, какое событие поддерживается. Кстати, очень похожий метод появился в официальной версии Bootstrap чуть позже: P

//------------------------------------------------------------------
//
//  Check if an event is supported by the browser eg. 'keypress'
//  * This was included to handle the "exhaustive deprecation" of jQuery.browser in jQuery 1.8
//
eventSupported: function(eventName) {         
    var isSupported = (eventName in this.$element);

    if (!isSupported) {
      this.$element.setAttribute(eventName, 'return;');
      isSupported = typeof this.$element[eventName] === 'function';
    }

    return isSupported;
}

Позже я использую его в своем коде для прикрепления обработчиков событий:

if (this.eventSupported('keydown')) {
  this.$element.on('keydown', $.proxy(this.keypress, this));
}




keyup