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;
}
};
// Вспомогательная функция преобразования идентификатора клавиши в каноническую форму.
Поделиться с друзьями: