Почему возврат false в обратном вызове keydown не останавливает событие нажатия кнопки?
у меня есть кнопка и следующая процедура javascript.
$("button").keydown( function(key) {
switch(key.keyCode) {
case 32: //space
return false;
}
} );
как я понял,return false; остановит обработку нажатия клавиши. Так что $("button").click(); не будет называться. Для других keyCodes это работает так, как ожидалось. Например, если я перехватываю40, который является кнопкой вниз, страница не прокручивается.
я заметил это поведение в Firefox.
почему return false; не останавливает событие нажатия кнопки на пространстве? Что делает спецификации javascript говорят об этом?
2 ответов
надеюсь, это ответит на ваш вопрос:
<input type="button" value="Press" onkeydown="doOtherStuff(); return false;">
return false; успешно отменяет событие в браузерах, если вызывается в конце атрибута обработчика событий в HTML. Насколько мне известно, это поведение официально нигде не указано.
если вы вместо этого установите событие через свойство обработчика событий в элементе DOM (например,button.onkeydown = function(evt) {...}) или с помощью addEventListener/attachEvent (например,button.addEventListener("keydown", function(evt) {...}, false)), то просто возвращения false из этой функции не работает в каждом браузере и вам нужно сделать returnValue и preventDefault() вещи из моего другого ответа. preventDefault определена в DOM 2 spec и реализуется большинством основных современных браузеров. returnValue является IE-специфичным.
во-первых, если вы обнаруживаете печатаемый символ, такой как пробел, вам было бы лучше с keypress событие. Во-вторых, способ предотвратить действие по умолчанию для вызова preventDefault() на событии в браузерах, отличных от IE, и установите событие returnValue свойство false в IE.
var button = document.getElementById("button");
button.onkeypress = function(evt) {
evt = evt || window.event;
var charCode = evt.keyCode || evt.which;
if (charCode == 32) {
if (evt.preventDefault) {
evt.preventDefault();
} else {
evt.returnValue = false;
}
}
};
Я не эксперт jQuery, и я предполагаю, что он позаботится о получении события для вас:
$("button").keypress(function(evt) {
var charCode = evt.keyCode || evt.which;
if (charCode == 32) {
if (evt.preventDefault) {
evt.preventDefault();
} else {
evt.returnValue = false;
}
}
});