Чтение онлайн

ЖАНРЫ

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

}

// Связывает указанный идентификатор клавиши с указанной функцией-обработчиком

Keymap.prototype.bind = function(key, func) {

this.map[Keymap.normalize(key)] = func;

};

// Удаляет привязку для указанного идентификатора клавиши

Keymap
.prototype.unbind = function(key) {

delete this.map[Keymap.normalize(key)];

};

//
Устанавливает этот объект Keymap в указанный HTML-элемент

Keymap.prototype.install = function(element) {

var
keymap
= this;

// Определить функции-обработчика события

function handler(event) { return keymap.dispatch(event, element); }

// Установить ее

if (element.addEventListener)

element.addEventListener("keydown", handler, false);

else

if (element.attachEvent)

element.attachEvent("onkeydown", handler);

};

// Этот метод делегирует обработку события клавиатуры, опираясь на привязки.

Keymap.prototype.dispatch = function(event, element) {

// Изначально нет ни имен клавиш-модификаторов, ни имени клавиши

var modifiers = ""

var keyname = null;

// Сконструировать строки модификаторов в каноническом виде из символов

// в нижнем регистре, расположив их в алфавитном порядке.

if (event.altKey) modifiers += "alt_”;

if (event.ctrlKey) modifiers += "Ctrl,";

if (event.metaKey) modifiers += "meta_";

if (event.shiftKey) modifiers += "shift.”;

// Имя клавиши легко получить, если реализовано свойство key,

// определяемое стандартом DOM Level 3:

if (event.key) keyname = event.key;

// Для получения имен функциональных клавиш
в Safari и Chrome можно

// использовать свойство keyldentifier

else

if (event. keyldentifier&&event. keyldentifier. substrings, 2) !== "U+")

keyname = event.keyldentifier;

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

else

keyname = Keymap.keyCodeToKeyName[event.keyCode];

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

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

if (!keyname) return;

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

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

var keyid = modifiers + keyname.toLowerCase;

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

var handler = this.map[keyid];

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

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

var retval = handler.call(element, event, keyid);

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

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

if (retval === false) {

if (event.stopPropagation)

event.stopPropagation; // модель DOM

else

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

if (event.preventDefault)

event.preventDefault; // DOM

else

event.returnValue = false; // IE

}

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

return retval;

}

};

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

Поделиться с друзьями: