addEventListener('keydown',handlekeydown,false) против.onkeydown работают по-разному для замены набранного нажатия клавиши
Я использую событие "keydown" для замены определенных символов, введенных в текстовом поле ввода.
Когда я использую:
document.getElementById('inputText').onkeydown = handleInputTextKeydown;
или эквивалент JQuery:
$('#inputText').on('keydown',handleInputTextKeydown);
Я получаю ожидаемый результат - например, нажатие клавиши Shift+i отображается как "í".
Однако, если я использую addEventListner как ловушку для ключей:
var tb = document.getElementById('inputText');
tb.addEventListener('keydown', handleInputTextKeydown, false);
В текстовом поле ввода отображаются оба замещающих символа (í) и "I" (заглавные буквы i) "íI".
Почему метод addEventListener отличается от двух хуков onkeydown?
Мой тестовый браузер IE 11.
Кстати, я использую вариант метода замены текста keydown, который был в другой записи stackru:
newKey = keyMap[keyPressed]; // Look for this key in our list of accented key shortcuts
if (newKey === undefined) {
return true; // Not in our list, let it bubble up as is
} else {
var oldValue, start, end;
oldValue = this.value; // Insert the updated key into the correct position within the edit textbox.
if (typeof this.selectionStart == "number" && typeof this.selectionEnd == "number") {
start = this.selectionStart;
end = this.selectionEnd;
this.value = oldValue.slice(0, start) + newKey + oldValue.slice(end);
}
// Move the caret
this.selectionStart = this.selectionEnd = start + 1;
return false;
1 ответ
Потому что вы должны предотвратить поведение по умолчанию с .addEventListener()
версия.
Возвращение false в конце обработчика для предотвращения поведения по умолчанию является специфичной для jQuery функцией и функцией .onkeydown
свойство, но не то, что работает с .addEventListener('keydown')
,
Вам нужно будет позвонить e.preventDefault()
(для современных браузеров) или набор e.returnValue = false
(для нестандартных браузеров).
Это больше, чем нужно для решения вашей проблемы, но при работе в простом javascript я использую кросс-браузерную заглушку обработки событий, которая позволяет мне возвращать false следующим образом:
// refined add event cross browser
function addEvent(elem, event, fn) {
// allow the passing of an element id string instead of the DOM elem
if (typeof elem === "string") {
elem = document.getElementById(elem);
}
function listenHandler(e) {
var ret = fn.apply(this, arguments);
if (ret === false) {
e.stopPropagation();
e.preventDefault();
}
return(ret);
}
function attachHandler() {
// normalize the target of the event
window.event.target = window.event.srcElement;
// make sure the event is passed to the fn also so that works the same too
// set the this pointer same as addEventListener when fn is called
var ret = fn.call(elem, window.event);
// support an optional return false to be cancel propagation and prevent default handling
// like jQuery does
if (ret === false) {
window.event.returnValue = false;
window.event.cancelBubble = true;
}
return(ret);
}
if (elem.addEventListener) {
elem.addEventListener(event, listenHandler, false);
} else {
elem.attachEvent("on" + event, attachHandler);
}
}