Pourquoi le renvoi de faux dans le rappel de la clé n'est-il pas arrêter l'événement de clic de bouton?

J'ai un bouton et la routine de javascript suivante.

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

Comme je l'ai compris, le return false; Arrêterait le contrôle de la touche en cours de traitement. Donc, $("button").click(); Ne serait pas appelé. Pour d'autres codes clés, cela fonctionne comme prévu. Par exemple, si j'intercepte 40 , qui est le bouton bas, la page ne défile pas.

J'ai remarqué ce comportement dans Firefox.

Pourquoi le return false; N'arrête pas l'événement de clic de bouton sur l'espace? Qu'est-ce que la spécification javascript dit à propos de cela?

J'espère que ça répond à ta question:

 <input type="button" value="Press" onkeydown="doOtherStuff(); return false;"> 

return false; Annule avec succès un événement sur les navigateurs s'il est appelé à la fin d'un attribut de gestionnaire d'événements dans le HTML. Ce comportement n'est pas formellement spécifié autant que je le sais.

Si vous placez plutôt un événement via une propriété de gestionnaire d'événement sur l'élément DOM (par exemple, button.onkeydown = function(evt) {...} ) ou en utilisant addEventListener / attachEvent (par exemple, button.addEventListener("keydown", function(evt) {...}, false) ) alors tout simplement renvoyer un false de cette fonction ne fonctionne pas dans tous les navigateurs et vous devez faire les returnValue et preventDefault() de mon autre réponse. preventDefault est spécifié dans la spécification DOM 2 et est implémenté par la plupart des navigateurs modernes traditionnels. returnValue est spécifique à IE.

Tout d'abord, si vous détectez un caractère imprimable tel que l'espace, vous seriez mieux avec l'événement de la keypress . Deuxièmement, la façon d'empêcher l'action par défaut est d'appeler preventDefault() sur l'événement dans des navigateurs non IE et de définir la propriété returnValue l'événement sur false dans 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; } } }; 

Je ne suis pas un expert jQuery et je suppose qu'il prend soin d'obtenir l'événement pour vous:

 $("button").keypress(function(evt) { var charCode = evt.keyCode || evt.which; if (charCode == 32) { if (evt.preventDefault) { evt.preventDefault(); } else { evt.returnValue = false; } } });