Почему возврат false в обратном вызове keydown не останавливает событие нажатия кнопки? - PullRequest
10 голосов
/ 28 октября 2009

У меня есть кнопка и следующая подпрограмма javascript.

$("button").keydown( function(key) {
  switch(key.keyCode) {
  case 32: //space
    return false;
  }
} );

как я понял, return false; остановит обработку нажатия клавиши. Так что $("button").click(); не назовут. Для других кодов клавиш это работает как положено. Например, если я перехватываю 40, то есть кнопку вниз, страница не прокручивается.

Я заметил это поведение в Firefox.

Почему return false; не останавливает событие нажатия кнопки на пробел? Что спецификация javascript говорит об этом?

Ответы [ 2 ]

18 голосов
/ 30 октября 2009

Надеюсь, что это отвечает на ваш вопрос:

<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 и реализован большинством современных браузеров. returnValue зависит от IE.

6 голосов
/ 28 октября 2009

Во-первых, если вы обнаружите печатный символ, например пробел, вам будет лучше с событием 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;
       }
   }
});
...