Почему возврат 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;
}
}
});