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