Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

Keypress:


Событие нажатия клавиши отправляется элементу, когда регистры браузера ввод клавиатуры. Это похоже на событие keydown, , за исключением случай повторений клавиш. Если пользователь нажимает и удерживает клавишу, событие срабатывает один раз, но запускаются отдельные события нажатия клавиш для каждого вставленного символа. Кроме того, клавиши-модификаторы (например, Shift), но не вызывает нажатия клавиш.

Keydown:


Событие keydown отправляется элементу, когда пользователь сначала нажимает кнопку на клавиатуре. Он может быть прикреплен к любому элементу, но событие отправляется только элементу, в котором имеет фокус. Фокусируемые элементы могут варьируются между браузерами, но элементы формы всегда могут получить фокус, поэтому разумные кандидаты на этот тип события.

Keyup:


Событие keyup отправляется элементу, когда пользователь выпускает ключ на клавиатура. Он может быть прикреплен к любому элементу, но событие только отправляется элементу, в котором имеет фокус. Фокусируемые элементы могут между браузерами, но элементы формы всегда могут разумные кандидаты на этот тип события.

Кроме того, это удобная часть информации, которая обычно затушевывается:


Если нажатия клавиш в любом месте должны быть пойманы (например, для реализации глобальные сочетания клавиш на странице), полезно приложить это поведение к объекту документа. Из-за пузырьков событий все нажатия клавиш отправятся в DOM до объекта документа, если только явно остановлен.

Чтобы определить, какой символ был введен, просмотрите объект события который передается функции обработчика. В то время как браузеры используют разные свойства для хранения этой информации, jQuery нормализует .whichчтобы вы могли надежно использовать его для получения кода символа.

Обратите внимание, что keydown и keyup предоставляют код, указывающий, какой ключ нажатие, а нажатие клавиши указывает, какой символ был введен.. Например, нижний регистр "a" будет отображаться как 65 с помощью keydown и keyup, но как 97 нажатием клавиши. В верхнем регистре "А" сообщается как 65 Мероприятия. Из-за этого различия при ловле специальных нажатий клавиш такие как клавиши со стрелками,.keydown() или .keyup() - лучший выбор.

Дополнительная информация о кнопке cmd для MAC-адресов: jQuery key code для командной строки

Ответ 2

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

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

То, как я лично обрабатываю его в загрузочном плагине, который я написал, заключается в создании настраиваемого метода для проверки того, какое событие поддерживается. Кстати, очень похожий метод появился в официальной версии 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));
}

Ответ 3

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

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