Какое событие класса управления отвечает за работу с клавиатурой

Обновлено: 03.07.2024

Если для запуска действия используются только события мыши, пользователь, использующий только клавиатуру, не может инициировать событие. Решение часто включает один или два шага.

Во-первых, вам нужно определить, может ли элемент, к которому вы прикрепляете события мыши, также получать фокус клавиатуры. Наиболее распространенными элементами, которые автоматически получают фокус, являются ссылки, элементы ввода формы и кнопки. Если вы прикрепляете события к другому типу элемента, например к общему

или , вам необходимо разрешить элементу получать фокус клавиатуры. Это делается путем добавления tabindex="0" к рассматриваемому элементу. Это говорит браузеру добавить элемент к естественному порядку табуляции на странице.

tabindex может принимать значения трех типов: -1, 0 или любое число больше 0. Каждое значение означает что-то свое.

tabindex="-1": Это делает элемент доступным для фокуса, но он может получить фокус только программно через JavaScript. Пользователь не может просто нажать клавишу табуляции и сфокусироваться на этом элементе.

tabindex=”0″: делает элемент доступным для фокуса и размещает элемент в естественном порядке табуляции на странице в зависимости от его положения в DOM. Пользователь сможет сфокусироваться на этом элементе с помощью клавиши табуляции.

tabindex=”1″ или что-то большее, чем 0: это делает элемент доступным для фокуса, но размещает элемент в порядке табуляции, соответствующем числу, установленному в атрибуте. Этой практики следует избегать, за исключением редких случаев. Порядок вкладок почти всегда должен соответствовать естественному порядку страницы.

Во-вторых, предоставьте ту же функциональность с помощью соответствующих событий клавиатуры. В следующей таблице перечислены события мыши и соответствующие им события клавиатуры.

Соответствующие события мыши и клавиатуры < tr>
Событие мыши Событие клавиатуры
mousedown keydown
mouseup keyup
щелчок нажатие клавиши
наведение курсора фокус
mouseout размытие

Часто проще поместить весь код в третью функцию, чем хранить его в прослушивателе событий, чтобы и событие мыши, и событие клавиатуры могли вызывать одну и ту же функцию. Таким образом, вам нужно хранить свой код только в одном месте.

Объекты KeyboardEvent описывают взаимодействие пользователя с клавиатурой; каждое событие описывает отдельное взаимодействие между пользователем и клавишей (или комбинацией клавиши с клавишами-модификаторами) на клавиатуре. Тип события (нажатие клавиши, нажатие клавиши или нажатие клавиши) определяет тип действия клавиатуры.

Примечание. События KeyboardEvent просто указывают, какое взаимодействие пользователя было с клавишей на клавиатуре на низком уровне, не придавая контекстного значения этому взаимодействию. Когда вам нужно обработать ввод текста, вместо этого используйте событие ввода. События клавиатуры могут не запускаться, если пользователь использует альтернативные средства ввода текста, например систему рукописного ввода на планшете или графическом планшете.

Конструктор

Создает новый объект KeyboardEvent.

Константы

Интерфейс KeyboardEvent определяет следующие константы.

Расположение клавиатуры

Следующие константы определяют, из какой части клавиатуры исходит событие нажатия клавиши. Доступ к ним осуществляется как KeyboardEvent.DOM_KEY_LOCATION_STANDARD и т. д.

Клавиша, описываемая событием, не идентифицируется как находящаяся в определенной области клавиатуры; она не находится на цифровой клавиатуре (если только это не клавиша NumLock), а для клавиш, которые дублируются на левой и правой сторонах клавиатуры, клавиша по какой-либо причине не должна быть связана с этим местоположением.

Примеры включают буквенно-цифровые клавиши на стандартной клавиатуре PC 101 US, клавишу NumLock и клавишу пробела.

Эта клавиша может находиться в нескольких местах на клавиатуре, в данном случае она находится на левой стороне клавиатуры.

Примеры включают левую клавишу Control, левую клавишу Command на клавиатуре Macintosh или левую клавишу Shift.

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

Примеры включают правую клавишу Shift и правую клавишу Alt (Option на клавиатуре Mac).

Клавиша расположена на цифровой клавиатуре или является виртуальной клавишей, связанной с цифровой клавиатурой, если существует более одного места, из которого может быть получена клавиша. Клавиша NumLock не попадает в эту группу и всегда кодируется с расположением DOM_KEY_LOCATION_STANDARD .

Примеры включают цифры на цифровой клавиатуре, клавишу ввода на клавиатуре и десятичную точку на клавиатуре.

Свойства

Этот интерфейс также наследует свойства своих родителей, UIEvent и Event .

Возвращает логическое значение, которое является истинным, если клавиша Alt ( Option или ⌥ в OS X) была активна, когда было сгенерировано событие клавиши.

Возвращает DOMString с кодовым значением физического ключа, представленного событием.

Предупреждение. При этом игнорируется раскладка клавиатуры пользователя, поэтому, если пользователь нажимает клавишу в позиции "Y" в раскладке клавиатуры QWERTY (около середины строки над исходной строкой), всегда возвращается "KeyY". ", даже если у пользователя есть клавиатура QWERTZ (что означало бы, что пользователь ожидает "Z", а все остальные свойства будут указывать "Z") или раскладка клавиатуры Дворака (где пользователь ожидает "F"). Если вы хотите отображать пользователю правильные нажатия клавиш, вы можете использовать Keyboard.getLayoutMap() .

Возвращает логическое значение, которое является истинным, если клавиша Ctrl была активна во время генерации события клавиши.

Возвращает логическое значение, которое является истинным, если событие запускается в промежутке времени после CompositionStart и до CompositionEnd .

Возвращает DOMString, представляющую значение ключа для ключа, представленного событием.

Возвращает DOMString, представляющую строку языкового стандарта, указывающую языковой стандарт, для которого настроена клавиатура. Это может быть пустая строка, если браузер или устройство не знают язык клавиатуры.

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

Возвращает число, представляющее расположение клавиши на клавиатуре или другом устройстве ввода. Список констант, определяющих местоположения, показан выше в разделе Расположение клавиатуры.

Возвращает логическое значение, которое является истинным, если клавиша Meta (на клавиатурах Mac — клавиша ⌘ Command; на клавиатурах Windows — клавиша Windows ( ⊞ )) была активна во время создания события клавиши.

Возвращает логическое значение, которое является истинным, если клавиша удерживается нажатой, так что она автоматически повторяется.

Возвращает логическое значение, которое является истинным, если клавиша Shift была активна во время создания события клавиши.

Методы

Этот интерфейс также наследует методы своих родителей, UIEvent и Event .

Возвращает логическое значение, указывающее, была ли нажата клавиша-модификатор, такая как Alt , Shift , Ctrl или Meta , при создании события.

Устаревшие методы

Инициализирует объект KeyboardEvent. Это было реализовано только в Firefox и даже там больше не поддерживается; вместо этого следует использовать конструктор KeyboardEvent().

Инициализирует объект KeyboardEvent. Теперь это устарело. Вместо этого вы должны использовать конструктор KeyboardEvent().

Устаревшие свойства

Возвращает DOMString, представляющую символьное значение ключа. Если ключ соответствует печатному символу, это значение является непустой строкой Unicode, содержащей этот символ. Если ключ не имеет печатного представления, это пустая строка.

Примечание. Если ключ используется как макрос, который вставляет несколько символов, значением этого атрибута является вся строка, а не только первый символ.

Возвращает число, представляющее номер ссылки Unicode ключа; этот атрибут используется только событием нажатия клавиши. Для ключей, атрибут char которых содержит несколько символов, это значение Unicode для первого символа в этом атрибуте. В Firefox 26 это возвращает коды для печатных символов.

Внимание! Этот атрибут устарел; вместо этого следует использовать KeyboardEvent.key, если он доступен.

Возвращает число, представляющее числовой код, зависящий от системы и реализации, идентифицирующий неизмененное значение нажатой клавиши.

Внимание! Этот атрибут устарел; вместо этого следует использовать KeyboardEvent.key, если он доступен.

Это нестандартное свойство, которое устарело и заменено KeyboardEvent.key . Это было частью старой версии DOM Level 3 Events.

Это нестандартный устаревший псевдоним для KeyboardEvent.location . Это было частью старой версии DOM Level 3 Events.

Возвращает число, представляющее числовой код, зависящий от системы и реализации, идентифицирующий неизмененное значение нажатой клавиши; обычно это то же самое, что и keyCode .

Внимание! Этот атрибут устарел; вместо этого следует использовать KeyboardEvent.key, если он доступен.

События

Следующие события основаны на типе KeyboardEvent. Они могут быть доставлены любому объекту, который реализует GlobalEventHandlers, включая Element, Document и Window. В приведенном ниже списке каждое событие ссылается на документацию по обработчику документа для события, которое обычно применяется ко всем получателям.

Ключ был нажат.

Ключ выпущен.

Устаревшие события

Была нажата клавиша, которая обычно выводит символьное значение. Это событие сильно зависело от устройства и устарело. Вы не должны использовать его.

Примечания по использованию

Существует три типа событий клавиатуры: нажатие клавиши , нажатие клавиши и нажатие клавиши .Для большинства ключей Gecko отправляет последовательность ключевых событий следующим образом:

  1. При первом нажатии клавиши отправляется событие нажатия клавиши.
  2. Если клавиша не является клавишей-модификатором, отправляется событие нажатия клавиши.
  3. Когда пользователь отпускает клавишу, отправляется событие keyup.

Особые случаи

Некоторые клавиши переключают состояние светового индикатора; к ним относятся такие клавиши, как Caps Lock, Num Lock и Scroll Lock. В Windows и Linux эти ключи отправляют только события keydown и keyup.

Примечание. В Linux Firefox 12 и более ранние версии также отправляли событие нажатия клавиши для этих клавиш.

Однако ограничение модели событий macOS приводит к тому, что Caps Lock отправляет только событие нажатия клавиши. Num Lock поддерживался на некоторых старых моделях ноутбуков (модели 2007 года и старше), но с тех пор macOS не поддерживает Num Lock даже на внешних клавиатурах. На старых MacBook с клавишей Num Lock эта клавиша не генерирует никаких ключевых событий. Gecko поддерживает клавишу Scroll Lock, если подключена внешняя клавиатура с клавишей F14. В некоторых старых версиях Firefox эта клавиша генерировала событие нажатия клавиши; это непоследовательное поведение было ошибкой 602812.

Автоповтор

Когда клавиша нажата и удерживается, она начинает автоматически повторяться. Это приводит к отправке последовательности событий, подобной следующей:

Это то, о чем говорит спецификация DOM Level 3. Однако есть некоторые предостережения, как описано ниже.

Автоповтор в некоторых средах GTK, таких как Ubuntu 9.4

В некоторых средах на основе GTK автоповтор автоматически отправляет собственное событие нажатия клавиши во время автоповторения, и Gecko не может отличить повторяющуюся серию нажатий клавиш от автоповторения. Таким образом, на этих платформах ключ автоповтора будет генерировать следующую последовательность событий:

К сожалению, в этих средах веб-контент не может определить разницу между автоматически повторяющимися клавишами и клавишами, которые просто нажимаются несколько раз.

Обработка автоматического повтора до Gecko 5.0

До Gecko 5.0 (Firefox 5.0/Thunderbird 5.0/SeaMonkey 2.2) работа с клавиатурой была менее согласованной на разных платформах.

Поведение автоматического повтора такое же, как в Gecko 4.0 и более поздних версиях.

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

Поведение события зависит от конкретной платформы. Он будет вести себя как Windows или Mac в зависимости от того, что делает собственная модель событий.

Примечание. Запуск события вручную не создает действие по умолчанию, связанное с этим событием. Например, ручное срабатывание ключевого события не приводит к тому, что эта буква появляется в сфокусированном текстовом вводе. В случае событий пользовательского интерфейса это важно из соображений безопасности, поскольку не позволяет скриптам имитировать действия пользователя, взаимодействующие с самим браузером.

События — это в основном действия пользователя, такие как нажатие клавиш, клики, движения мыши и т. д., или некоторые события, например системные уведомления. Приложения должны реагировать на события, когда они происходят.

Нажатие кнопки, ввод текста в текстовое поле или нажатие элемента меню — все это примеры событий. Событие — это действие, которое вызывает функцию или может вызвать другое событие. Обработчики событий — это функции, которые сообщают, как реагировать на событие.

Обработка событий мыши

События мыши происходят при движениях мыши в формах и элементах управления. Ниже приведены различные события мыши, связанные с классом Control —

MouseDown — происходит при нажатии кнопки мыши

MouseEnter — это происходит, когда указатель мыши входит в элемент управления

MouseHover — это происходит, когда указатель мыши наводится на элемент управления

MouseLeave — происходит, когда указатель мыши покидает элемент управления

MouseMove — это происходит, когда указатель мыши перемещается по элементу управления

MouseUp — это происходит, когда указатель мыши находится над элементом управления и кнопка мыши отпущена

MouseWheel — это происходит, когда колесико мыши движется, а элемент управления находится в фокусе

Обработчики событий мыши получают аргумент типа MouseEventArgs. Объект MouseEventArgs используется для обработки событий мыши. Он имеет следующие свойства —

Кнопки — указывает на нажатую кнопку мыши

Клики — указывает количество кликов

Дельта — указывает количество фиксаторов, на которые повернулось колесико мыши

X — указывает координату x щелчка мыши

Y — указывает координату Y щелчка мыши

Пример

Ниже приведен пример, показывающий, как обрабатывать события мыши. Выполните следующие шаги —

Добавьте в форму три метки, три текстовых поля и кнопку.

Измените текстовые свойства ярлыков на "Идентификатор клиента", "Имя" и "Адрес" соответственно.

Измените свойства имени текстовых полей на txtID, txtName и txtAddress соответственно.

Измените текстовое свойство кнопки на "Отправить".

Добавьте следующий код в окно редактора кода —

Когда приведенный выше код выполняется и запускается с помощью кнопки «Пуск», доступной на панели инструментов Microsoft Visual Studio, отображается следующее окно —

Пример обработки событий 1

Попробуйте ввести текст в текстовые поля и проверьте события мыши –

Форма результатов обработки событий

Обработка событий клавиатуры

Ниже приведены различные события клавиатуры, связанные с классом Control —

KeyDown — происходит, когда клавиша нажата, а элемент управления находится в фокусе

KeyPress — происходит, когда клавиша нажата, а элемент управления находится в фокусе

KeyUp — происходит, когда клавиша отпускается, когда элемент управления находится в фокусе

Обработчики событий KeyDown и KeyUp получают аргумент типа KeyEventArgs. Этот объект имеет следующие свойства —

Alt — указывает, нажата ли клавиша ALT

Контроль — указывает, нажата ли клавиша CTRL

Обработано — указывает, обработано ли событие

KeyCode — сохраняет код клавиатуры для события

KeyData — хранит данные клавиатуры для события

KeyValue — сохраняет значение клавиатуры для события

Модификаторы — указывает, какие клавиши-модификаторы (Ctrl, Shift и/или Alt) нажаты

Shift — указывает, нажата ли клавиша Shift

Обработчики событий KeyDown и KeyUp получают аргумент типа KeyEventArgs. Этот объект имеет следующие свойства —

Handled — указывает, обработано ли событие KeyPress

KeyChar — сохраняет символ, соответствующий нажатой клавише

Пример

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

Добавьте метку с текстовым свойством «Возраст» и добавьте соответствующее текстовое поле с именем txtAge.

Добавьте следующие коды для обработки событий KeyUP текстового поля txtID.

Добавьте следующие коды для обработки событий KeyUP текстового поля txtID.

Когда приведенный выше код выполняется и запускается с помощью кнопки «Пуск», доступной на панели инструментов Microsoft Visual Studio, отображается следующее окно —

Пример события VB.Net

Если вы оставите текст для возраста или идентификатора пустым или введете какие-либо нечисловые данные, появится окно предупреждающего сообщения и соответствующий текст будет удален.

Прежде чем мы перейдем к клавиатуре, обратите внимание, что на современных устройствах есть и другие способы «что-то ввести». Например, люди используют распознавание речи (особенно на мобильных устройствах) или копируют/вставляют с помощью мыши.

Поэтому, если мы хотим отслеживать любой ввод в поле, событий клавиатуры недостаточно. Есть еще одно событие с именем input для отслеживания изменений поля любым способом. И это может быть лучшим выбором для такой задачи. Мы рассмотрим это позже в главе События: изменение, ввод, вырезание, копирование, вставка.

События клавиатуры следует использовать, когда мы хотим обрабатывать действия клавиатуры (виртуальная клавиатура также учитывается). Например, реагировать на клавиши со стрелками вверх и вниз или горячие клавиши (включая комбинации клавиш).

Тестовый стенд

Чтобы лучше понять события клавиатуры, вы можете использовать тестовый стенд ниже.

Попробуйте разные комбинации клавиш в текстовом поле.

Нажатие и нажатие клавиш

События keydown происходят, когда клавиша нажата, а затем keyup — когда ее отпускают.

event.code и event.key

Свойство key объекта события позволяет получить символ, а свойство code объекта события позволяет получить «физический код клавиши».

Например, одну и ту же клавишу Z можно нажимать с Shift или без него. Это дает нам два разных символа: Z в нижнем регистре и Z в верхнем регистре.

Event.key — это именно тот символ, и он будет другим. Но event.code тот же:

Ключ event.key event.code
Z z (нижний регистр) KeyZ
Shift + Z Z ( верхний регистр) KeyZ

Если пользователь работает с разными языками, то при переключении на другой язык вместо "Z" появится совершенно другой символ. Это станет значением event.key , а event.code всегда будет одним и тем же: "KeyZ" .

Каждая клавиша имеет код, зависящий от ее расположения на клавиатуре. Коды клавиш описаны в спецификации кодов событий пользовательского интерфейса.

  • Буквенные клавиши имеют коды "Ключ": "КлючA", "КлючB" и т. д.
  • Цифровые клавиши имеют коды: «Цифра» : «Цифра0», «Цифра1» и т. д.
  • Специальные клавиши кодируются своими именами: "Enter", "Backspace", "Tab" и т. д.

Существует несколько распространенных раскладок клавиатуры, и в спецификации указаны коды клавиш для каждой из них.

Прочитайте буквенно-цифровой раздел спецификации, чтобы узнать больше кодов, или просто нажмите клавишу на испытательном стенде выше.

Кажется очевидным, но люди все равно совершают ошибки.

Пожалуйста, избегайте опечаток: это KeyZ , а не keyZ . Проверка вроде event.code=="keyZ" не сработает: первая буква "Ключ" должна быть в верхнем регистре.

Что делать, если клавиша не дает никакого символа? Например, Shift или F1 или другие. Для этих ключей event.key примерно совпадает с event.code :

Ключ event.key event.code
F1 F1 F1
Backspace Backspace Backspace
Shift Shift ShiftRight или ShiftLeft

Обратите внимание, что event.code указывает, какая именно клавиша нажата. Например, на большинстве клавиатур есть две клавиши Shift: слева и справа. Event.code сообщает нам, какая именно клавиша была нажата, а event.key отвечает за «значение» клавиши: что это такое («Shift»).

Допустим, мы хотим обработать горячую клавишу: Ctrl + Z (или Cmd + Z для Mac). Большинство текстовых редакторов привязывают к нему действие «Отменить». Мы можем настроить слушателя на нажатие клавиши и проверить, какая клавиша нажата.

С одной стороны, значением event.key является символ, оно меняется в зависимости от языка. Если посетитель имеет несколько языков в ОС и переключается между ними, одна и та же клавиша дает разные символы. Так что имеет смысл проверить event.code , он всегда один и тот же.

С другой стороны, есть проблема с event.code . Для разных раскладок клавиатуры одна и та же клавиша может иметь разные символы.

Например, вот раскладка для США («QWERTY») и под ней немецкая раскладка («QWERTZ») (из Википедии):

Для одного и того же ключа в раскладке США используется буква «Z», а в раскладке Германии — «Y» (буквы меняются местами).

Буквально, event.code будет равно KeyZ для людей с немецкой раскладкой, когда они нажимают Y .

Если мы проверим event.code == 'KeyZ' в нашем коде, то для людей с немецкой раскладкой такой тест пройдет, когда они нажмут Y .

Это звучит очень странно, но это так. В спецификации явно упоминается такое поведение.

Таким образом, event.code может соответствовать неправильному символу для неожиданного макета. Одни и те же буквы в разных раскладках могут соответствовать разным физическим клавишам, что приводит к разным кодам. К счастью, это происходит только с несколькими кодами, например. keyA, keyQ, keyZ (как мы видели) и не происходит со специальными клавишами, такими как Shift. Вы можете найти список в спецификации.

Для надежного отслеживания символов, зависящих от макета, лучше использовать event.key.

С другой стороны, преимуществом event.code является то, что он всегда остается одним и тем же и привязан к местоположению физического ключа. Так что горячие клавиши, которые полагаются на него, хорошо работают даже в случае переключения языка.

Хотим ли мы обрабатывать ключи, зависящие от макета? Тогда вам подойдет event.key.

Или мы хотим, чтобы горячая клавиша работала даже после смены языка? Тогда event.code может быть лучше.

Автоповтор

Если клавиша нажимается достаточно долго, она начинает «автоповторяться»: нажатие клавиши срабатывает снова и снова, а затем, когда ее отпускают, мы, наконец, получаем keyup . Так что это нормально иметь много нажатий клавиш и одно нажатие .

Для событий, запускаемых автоматическим повтором, объект события имеет свойство event.repeat со значением true .

Действия по умолчанию

Действия по умолчанию различаются, так как с помощью клавиатуры может выполняться множество действий.

  • На экране появляется символ (наиболее очевидный результат).
  • Символ удален (клавиша Delete).
  • Страница прокручивается (клавиша PageDown).
  • В браузере открывается диалоговое окно «Сохранить страницу» ( Ctrl + S )
  • …и так далее.

Предотвращение действия по умолчанию при нажатии клавиши может отменить большинство из них, за исключением специальных клавиш ОС. Например, в Windows Alt + F4 закрывает текущее окно браузера. И это невозможно остановить, запретив действие по умолчанию в JavaScript.

Например, в приведенном ниже примере предполагается номер телефона, поэтому он не принимает клавиши, кроме цифр, + , () или - :

Здесь обработчик onkeydown использует checkPhoneKey для проверки нажатой клавиши. Если он действителен (от 0 до 9 или один из +-() ), то он возвращает true , иначе false .

Как мы знаем, ложное значение, возвращаемое обработчиком событий, назначенное с помощью свойства DOM или атрибута, как показано выше, предотвращает действие по умолчанию, поэтому в ключах for ничего не отображается, если они не прошли проверку. (возвращаемое истинное значение ни на что не влияет, только возвращаются ложные значения)

Обратите внимание, что специальные клавиши, такие как Backspace, Left, Right, не работают при вводе. Это побочный эффект строгого фильтра checkPhoneKey. Эти ключи возвращают false .

Давайте немного ослабим фильтр, разрешив использование клавиш со стрелками влево , вправо и Delete , Backspace :

Теперь стрелки и удаление работают корректно.

Несмотря на то, что у нас есть ключевой фильтр, можно ввести что угодно, используя мышь и щелчок правой кнопкой мыши + Вставить. Мобильные устройства предоставляют другие средства для ввода значений. Так что фильтр не на 100% надежен.

Альтернативный подход заключается в отслеживании события oninput — оно срабатывает после любого изменения. Там мы можем проверить новое значение input.value и изменить его/выделить, если оно недействительно. Или мы можем использовать оба обработчика событий вместе.

Наследие

В прошлом существовало событие нажатия клавиши, а также keyCode , charCode , свойства объекта события.

При работе с ними было так много несовместимостей браузеров, что у разработчиков спецификации не было другого выхода, кроме как объявить их все устаревшими и создать новые, современные события (описанные выше в этой главе). Старый код все еще работает, так как браузеры продолжают его поддерживать, но в нем больше нет необходимости.

Мобильные клавиатуры

При использовании виртуальных/мобильных клавиатур, официально известных как IME (редактор метода ввода), в стандарте W3C указано, что e.keyCode KeyboardEvent должен иметь значение 229, а e.key должен быть "неопознанным" .

Несмотря на то, что некоторые из этих клавиатур могут по-прежнему использовать правильные значения для e.key , e.code , e.keyCode… при нажатии определенных клавиш, таких как стрелки или пробел, нет гарантии, поэтому логика вашей клавиатуры может не всегда работать на мобильные устройства.

Обзор

Нажатие клавиши всегда вызывает событие клавиатуры, будь то символьные клавиши или специальные клавиши, такие как Shift или Ctrl и т. д. Единственным исключением является клавиша Fn, которая иногда присутствует на клавиатуре ноутбука. Для него нет события клавиатуры, потому что оно часто реализуется на более низком уровне, чем ОС.

  • keydown – при нажатии клавиши (автоповторяется, если клавиша нажата долго),
  • keyup – при отпускании клавиши.

Основные свойства события клавиатуры:

  • code — «код клавиши» («KeyA», «ArrowLeft» и т. д.), соответствующий физическому расположению клавиши на клавиатуре.
  • key – символ ("A" , "a" и т. д.) для несимвольных ключей, таких как Esc , обычно имеет то же значение, что и code .

В прошлом события клавиатуры иногда использовались для отслеживания ввода пользователя в поля формы. Это ненадежно, потому что данные могут поступать из разных источников. У нас есть события ввода и изменения для обработки любого ввода (описано далее в главе События: изменение, ввод, вырезание, копирование, вставка). Они срабатывают после любого ввода, включая копирование и распознавание речи.

Мы должны использовать события клавиатуры, когда нам действительно нужна клавиатура. Например, реагировать на горячие клавиши или специальные клавиши.

Задачи

Расширенные горячие клавиши

Создайте функцию runOnKeys(func, code1, code2, .code_n), которая запускает func при одновременном нажатии клавиш с кодами code1 , code2 , …, code_n .

Например, приведенный ниже код показывает оповещение при одновременном нажатии клавиш "Q" и "W" (на любом языке, с CapsLock или без него)

Мы должны использовать два обработчика: document.onkeydown и document.onkeyup .

Давайте создадим set press = new Set(), чтобы сохранить нажатые в данный момент клавиши.

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

Хотя вы можете представить проект Visual Studio как серию процедур, которые выполняются в определенной последовательности, на самом деле большинство программ управляются событиями, то есть поток выполнения определяется внешними событиями, называемыми событиями. .

Событие — это сигнал, сообщающий приложению о том, что произошло что-то важное. Например, когда пользователь щелкает элемент управления в форме, форма может сгенерировать событие Click и вызвать процедуру, обрабатывающую это событие. События также позволяют общаться между отдельными задачами. Скажем, например, что ваше приложение выполняет задачу сортировки отдельно от основного приложения. Если пользователь отменяет сортировку, ваше приложение может отправить событие отмены с указанием остановить процесс сортировки.

Термины и концепции мероприятия

В этом разделе описываются термины и понятия, используемые с событиями в Visual Basic.

Объявление событий

Вы объявляете события в классах, структурах, модулях и интерфейсах, используя ключевое слово Event, как в следующем примере:

Вызов событий

Событие похоже на сообщение о том, что произошло что-то важное. Действие по передаче сообщения называется вызовом события. В Visual Basic вы инициируете события с помощью оператора RaiseEvent, как в следующем примере:

События должны вызываться в рамках класса, модуля или структуры, в которой они объявлены. Например, производный класс не может вызывать события, унаследованные от базового класса.

Отправители событий

Любой объект, способный вызвать событие, является отправителем события, также известным как источник события. Примерами отправителей событий являются формы, элементы управления и пользовательские объекты.

Обработчики событий

Обработчики событий – это процедуры, которые вызываются при возникновении соответствующего события. Вы можете использовать любую допустимую подпрограмму с соответствующей сигнатурой в качестве обработчика событий. Однако вы не можете использовать функцию в качестве обработчика событий, поскольку она не может возвращать значение источнику события.

Visual Basic использует стандартное соглашение об именовании для обработчиков событий, которое сочетает в себе имя отправителя события, символ подчеркивания и имя события. Например, событие Click кнопки с именем button1 будет называться Sub button1_Click .

Мы рекомендуем вам использовать это соглашение об именах при определении обработчиков событий для ваших собственных событий, но это не обязательно; вы можете использовать любое допустимое имя подпрограммы.

Связывание событий с обработчиками событий

Прежде чем обработчик событий можно будет использовать, вы должны сначала связать его с событием с помощью инструкции Handles или AddHandler.

WithEvents и пункт Handles

Инструкция WithEvents и предложение Handles обеспечивают декларативный способ указания обработчиков событий. Событие, вызванное объектом, объявленным с помощью ключевого слова WithEvents, может быть обработано любой процедурой с оператором Handles для этого события, как показано в следующем примере:

Инструкция WithEvents и предложение Handles часто являются лучшим выбором для обработчиков событий, поскольку используемый ими декларативный синтаксис упрощает кодирование, чтение и отладку обработки событий. Однако помните о следующих ограничениях на использование переменных WithEvents:

Вы не можете использовать переменную WithEvents в качестве переменной объекта. То есть вы не можете объявить его как Object — вы должны указать имя класса при объявлении переменной.

Поскольку общие события не привязаны к экземплярам класса, вы не можете использовать WithEvents для декларативной обработки общих событий. Точно так же вы не можете использовать WithEvents или Handles для обработки событий из Structure . В обоих случаях вы можете использовать оператор AddHandler для обработки этих событий.

Вы не можете создавать массивы переменных WithEvents.

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

Хотя предложение Handles является стандартным способом связывания события с обработчиком событий, оно ограничено связыванием событий с обработчиками событий во время компиляции.

В некоторых случаях, например в случае событий, связанных с формами или элементами управления, Visual Basic автоматически заглушает пустой обработчик событий и связывает его с событием. Например, когда вы дважды щелкаете командную кнопку в форме в режиме конструктора, Visual Basic создает пустой обработчик событий и переменную WithEvents для командной кнопки, как показано в следующем коде:

AddHandler и RemoveHandler

Предложение AddHandler похоже на предложение Handles в том смысле, что оба позволяют указать обработчик событий. Однако AddHandler, используемый с RemoveHandler, обеспечивает большую гибкость, чем предложение Handles, позволяя вам динамически добавлять, удалять и изменять обработчик событий, связанный с событием. Если вы хотите обрабатывать общие события или события из структуры, вы должны использовать AddHandler .

AddHandler принимает два аргумента: имя события от отправителя события, такого как элемент управления, и выражение, результатом которого является делегат. Вам не нужно явно указывать класс делегата при использовании AddHandler , так как оператор AddressOf всегда возвращает ссылку на делегат. В следующем примере обработчик события связывается с событием, вызванным объектом:

RemoveHandler , отключающий событие от обработчика событий, использует тот же синтаксис, что и AddHandler . Например:

В следующем примере обработчик события связан с событием, и это событие вызывается. Обработчик события перехватывает событие и отображает сообщение.

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

Наконец, второй обработчик события удаляется, а событие вызывается в третий раз. Поскольку с событием больше не связан обработчик событий, никаких действий не предпринимается.

Обработка событий, унаследованных от базового класса

Производные классы — классы, наследующие характеристики от базового класса, — могут обрабатывать события, вызванные их базовым классом, с помощью инструкции Handles MyBase.

Для обработки событий базового класса

Объявите обработчик событий в производном классе, добавив объект Handles MyBase.eventname в строку объявления вашей процедуры обработки событий, где eventname — это имя события в базовом классе, который вы обрабатываете. Например:

Читайте также: