JavaScript. Подробное руководство, 6-е издание, стр. 270

<b>        return false;</b>

<b>      }</b>

<b>    }</b>

<b>    // Если все символы оказались допустимыми, скрыть элемент</b>

<b>    // с сообщением, если он был указан.</b>

<b>    if (messageElement) messageElement.style.visibility = &quot;hidden&quot;;</b>

<b>  }</b>

<b>}):</b>

События «keypress» и «textinput» генерируются непосредственно перед фактической вставкой нового текста в элемент документа, обладающий фокусом ввода, благодаря чему обработчики этих событий могут предотвратить вставку текста, отменив событие. Броузеры также реализуют событие «input», которое возбуждается после вставки текста в элемент. Это событие нельзя отменить и соответствующий ему объект события не содержит информации о вставленном тексте - оно просто извещает о том, что текстовое содержимое элемента изменилось. Если, к примеру, потребуется обеспечить ввод только символов в верхнем регистре, можно определить обработчик события «input», как показано ниже:

<b>SURNAME: &lt;input type=&quot;text&quot; oninput=&quot;this.value = this.value.toUpperCase(); &quot;&gt;</b>

Событие «input» стандартизовано в спецификации HTML5 и поддерживается всеми современными броузерами, кроме IE. Похожего эффекта в IE можно добиться, обнаруживая изменение значения свойства value текстового элемента ввода с помощью нестандартного события «propertychange*. В примере 17.7 демонстрируется, как можно реализовать преобразование всех вводимых символов в верхний регистр переносимым образом.

Пример 17.7. Использование события «propertychange» для определения факта ввода текста

<b>function forceToUpperCase(element) {</b>

<b>  if (typeof element === &quot;string&quot;) element=document.getElementByld(element);</b>

<b>  element.oninput = upcase;</b>

<b>  element.onpropertychange = upcaseOnPropertyChange;</b>

<b>  // Простой случай: обработчик события input</b>

<b>  function upcase(event) { this.value = this.value.toUpperCase(): }</b>

<b>  // Сложный случай: обработчик события propertychange</b>

<b>  function upcaseOnPropertyChange(event) {</b>

<b>    var e = event || window.event;</b>

<b>    // Если значение свойства value изменилось</b>

<b>    if (e.propertyName === &quot;value&quot;) {</b>

<b>      // Удалить обработчик onpropertychange, чтобы избежать рекурсии</b>

<b>      this.onpropertychange = null;</b>

<b>      // Преобразовать все символы в верхний регистр </b>

<b>      this.value = this.value.toUpperCase();</b>

<b>      // И восстановить обработчик события propertychange</b>

<b>      this.onpropertychange = upcaseOnPropertyChange;</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

17.9. События клавиатуры

События «keydown» и «keyup» возбуждаются, когда пользователь нажимает или отпускает клавишу на клавиатуре. Они генерируются для клавиш-модификаторов, функциональных клавиш и алфавитно-цифровых клавиш. Если пользователь удерживает клавишу нажатой настолько долго, что включается режим автоповтора, будет сгенерировано множество событий «keydown», прежде чем появится событие «keyup».

Объект события, соответствующий этим событиям, имеет свойство

<b>keyCode</b>
с числовым значением, которое определяет нажатую клавишу. Для клавиш, генерирующих печатаемые символы, в общем случае свойство
<b>keyCode</b>
содержит кодовый пункт Юникода, соответствующий основному символу, изображенному на клавише. Клавиши с буквами всегда генерируют значения
<b>keyCode</b>
, соответствующие символам в верхнем регистре, независимо от состояния клавиши Shift, поскольку именно такие символы изображены на клавишах. Аналогично цифровые клавиши всегда генерируют значения
<b>keyCode</b>
, соответствующие цифровым символам, изображенным на клавишах, даже если при этом вы удерживали нажатой клавишу Shift, чтобы ввести знак препинания. Для клавиш, не соответствующих печатаемым символам, свойство
<b>keyCode</b>
будет иметь некоторое другое значение. Эти значения свойства
<b>keyCode</b>
никогда не были стандартизованы. Однако в разных броузерах они отличаются не настолько сильно, чтобы нельзя было обеспечить переносимость. Это демонстрирует пример 17.8, включающий реализацию отображения значений
<b>keyCode</b>
в имена функциональных клавиш.

Подобно объектам событий мыши, объекты событий клавиатуры имеют свойства

<b>altKey, ctrlKey, metaKey</b>
и
<b>shiftKey</b>
, которые получают значение true, если в момент возникновения события удерживалась нажатой соответствующая клавиша-модификатор.

События «keydown* и «кеуuр», а также свойство

<b>keyCode</b>
используются уже более десяти лет, но они так и не были стандартизованы. Проект стандарта «DOM Level 3 Events» стандартизует типы «keydown» и «кеуuр» событий, но не стандартизует свойство
<b>keyCode</b>
. Вместо этого он определяет новое свойство
<b>key</b>
, которое должно содержать название клавиши в виде строки. Если клавиша соответствует печатаемому символу, свойство
<b>key</b>
должно содержать этот печатаемый символ. Для функциональных клавиш свойство
<b>key</b>
должно содержать такие значения, как «F2», «Home» или «Left».

На момент написания этих строк свойство

<b>key</b>
, определяемое стандартом «DOM Level 3 Events», еще не было реализовано ни в одном из броузеров. Однако броузеры на базе механизма Webkit, Safari и Chrome определяют в объектах этих событий свойство
<b>keyIdentifier</b>
. Для функциональных клавиш, подобно свойству
<b>key</b>
, свойство
<b>keyldentifier</b>
содержит не число, а строку с именем клавиши, таким как «Shift» или «Enter». Для клавиш, соответствующих печатаемым символам, это свойство содержит менее удобное в использовании строковое представление кодового пункта Юникода символа. Например, клавише «А» соответствует значение «U+0041».