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

<b>      keyname = event.keyldentifier;</b>

<b>    // В противном случае можно использовать свойство keyCode и отображение код-&gt;имя ниже</b>

<b>    else </b>

<b>      keyname = Keymap.keyCodeToKeyName[event.keyCode];</b>

<b>  // Если имя клавиши не удалось определить, просто проигнорировать событие</b>

<b>  // и вернуть управление,</b>

<b>  if (!keyname) return;</b>

<b>  // Канонический идентификатор клавиши состоит из имен модификаторов</b>

<b>  // и имени клавиши в нижнем регистре</b>

<b>  var keyid = modifiers + keyname.toLowerCase();</b>

<b>  // Проверить, имеется ли привязка для данного идентификатора клавиши</b>

<b>  var handler = this.map[keyid];</b>

<b>  if (handler) { // Если обработчик для данной клавиши, вызвать его</b>

<b>                // Вызвать функцию-обработчик</b>

<b>    var retval = handler.call(element, event, keyid);</b>

<b>    // Если обработчик вернул false, отменить действия по умолчанию</b>

<b>    // и прервать всплытие события</b>

<b>    if (retval === false) {</b>

<b>      if (event.stopPropagation)</b>

<b>        event.stopPropagation(); // модель DOM</b>

<b>      else</b>

<b>        event.cancelBubble = true; // модель IE</b>

<b>      if (event.preventDefault)</b>

<b>        event.preventDefault(); // DOM</b>

<b>      else</b>

<b>        event.returnValue = false; // IE</b>

<b>    }</b>

<b>    // Вернуть значение, полученное от обработчика</b>

<b>    return retval;</b>

<b>  }</b>

<b>};</b>

<b>// Вспомогательная функция преобразования идентификатора клавиши в каноническую форму.</b>

<b>// Нам необходимо преобразовать идентификатор &quot;meta” в &quot;Ctrl&quot;, чтобы превратить</b>

<b>// идентификатор Meta-C в &quot;Command-C&quot; на компьютерах Маc и в &quot;Ctrl-C&quot; на всех остальных. </b>

<b>Keymap.normalize = function(keyid) {</b>

<b>  keyid = keyid.toLowerCaseO; // В нижний регистр</b>

<b>  var words = keyid.split(/\s+|[\-+_]/); // Вычленить модификаторы</b>

<b>  var keyname = words.pop(); // keyname - последнее слово</b>

<b>  keyname = Keymap.aliases[keyname] || keyname; // Это псевдоним?</b>

<b>  words.sort(); // Сортировать модификаторы</b>

<b>  words.push(keyname); // Поместить обратно</b>

<b>                       // нормализованное имя</b>

<b>  return words.join// Объединить все вместе</b>

<b>};</b>

<b>Keymap.aliases = {  // Отображение привычных псевдонимов клавиш в их</b>

<b>  &quot;escape&quot;:&quot;esc&quot;,   // &quot;официальные&quot; имена, используемые в DOM Level 3,</b>

<b>  &quot;delete&quot;:&quot;del&quot;,   // и отображение кодов клавиш в имена ниже.</b>

<b>  &quot;return”:&quot;enter&quot;, // Имя и значение должны состоять только из символов </b>

<b>  &quot;Ctrl&quot;:&quot;control&quot;, // нижнего регистра.</b>

<b>  &quot;space&quot;:&quot;spacebar&quot;,</b>

<b>  &quot;ins&quot;:&quot;insert&quot;</b>

<b>};</b>

<b>// Старое свойство keyCode объекта события keydown не стандартизовано</b>

<b>// Но следующие значения с успехом могут использоваться в большинстве броузеров и ОС.</b>

<b>Keymap.keyCodeToKeyName = {</b>

<b>  // Клавиши со словами или стрелками на них</b>

<b>  8:&quot;Backspace&quot;, 9:&quot;Tab&quot;, 13:&quot;Enter&quot;, 16:&quot;Shift&quot;, 17:&quot;Control&quot;. 18:&quot;Alt&quot;,</b>

<b>  19:&quot;Pause”, 20:&quot;CapsLock&quot;, 27:&quot;Esc&quot;, 32:&quot;Spacebar&quot;, 33:&quot;PageUp&quot;,</b>

<b>  34:&quot;PageDown&quot;, 35:&quot;End&quot;, 36:&quot;Home&quot;, 37:&quot;Left&quot;, 38:&quot;Up&quot;, 39:&quot;Right&quot;,</b>

<b>  40:&quot;Down&quot;, 45:&quot;Insert&quot;, 46:&quot;Del&quot;,</b>

<b>  // Цифровые клавиши на основной клавиатуре (не на дополнительной)</b>

<b>  48:&quot;0&quot;,49:&quot;1&quot;,50:&quot;2&quot;,51:&quot;3&quot;,52:&quot;4&quot;,53:&quot;5&quot;,54:&quot;6&quot;,55:&quot;7&quot;,56:&quot;8&quot;,57:&quot;9&quot;.</b>