2009-10-28 8 views
9

Tengo un botón y la siguiente rutina de javascript.¿Por qué el retorno falso en la devolución de llamada por clave no detiene el evento de clic de botón?

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

como lo entendía, la return false; sería detener la pulsación de tecla de ser procesada. Por lo tanto, no se llamará a $("button").click();. Para otros KeyCodes esto funciona como se esperaba. Por ejemplo, si intercepto 40, que es el botón de abajo, la página no se desplaza.

me di cuenta de este comportamiento en Firefox.

¿Por qué la return false; no se detiene el evento de clic de botón en el espacio? ¿Qué dice la especificación javascript sobre esto?

+1

es lo que realmente dicen "retorno fale" en su código real? Si es así, ese podría ser tu problema. fale. – rmeador

+0

En su fragmento de código tiene "return fale;" - ¿Es este el código tal como existe? si es así, es un error tipográfico simple. – artlung

+0

No I mi código real devuelve falso. De hecho, uso este código para interceptar otros botones como abajo, y funciona para ellos. – johannes

Respuesta

13

Esperamos haber respondido a su pregunta:

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

return false; cancela con éxito un evento en todos los navegadores si se llama al final de un atributo del controlador de eventos en el HTML. Este comportamiento no está especificado formalmente en ningún lugar, hasta donde yo sé.

Si en lugar de configurar un evento a través de una propiedad de controlador de eventos en el elemento DOM (por ejemplo button.onkeydown = function(evt) {...}) o el uso de addEventListener/attachEvent (por ejemplo button.addEventListener("keydown", function(evt) {...}, false)) a continuación, sólo volver false de esa función no funciona en todos los navegadores y hay que hacer returnValue y preventDefault() cosas de mi otra respuesta. preventDefault se especifica en el DOM 2 spec el cual es implementado por la mayoría de los navegadores modernos convencionales. returnValue es específico de IE.

+0

En mi formulario asp.net, sigue activando la actualización de la página. – Si8

+1

@ Si8: Eso podría suceder si su equivalente de 'doOtherStuff()' arroja un error. –

6

En primer lugar, si usted está detectando un carácter imprimible, tales como el espacio, que sería mejor con el evento keypress. En segundo lugar, la manera de prevenir la acción predeterminada es llamar preventDefault() en el caso de los navegadores no-IE y establezca la propiedad del evento returnValue-false en 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; 
     } 
    } 
}; 

No soy un experto en jQuery y supongo que se encarga de obtener el evento para usted:

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

Lo probé, y 'key.preventDefault();' no cambia nada en firefox. 'keydown' detecta claves, que producen caracteres imprimibles, entonces, ¿qué pasa con' keydown'? – johannes

+0

OK. ¿Cuál es el HTML que produce el botón? ¿Estás seguro de que se está llamando al controlador de pulsaciones de teclas? En el caso de espacio, probablemente esté bien usar 'keydown' y' keyCode' 32, pero en general con caracteres imprimibles usando 'keypress' abstrae cualquier diferencia de potencial entre teclados u otros dispositivos de entrada extrayendo el carácter resultante de la pulsación de tecla en lugar de un código correspondiente a una tecla en un dispositivo de entrada. –

+0

@Tim: el ejemplo de código original OPs es jQuery válido para cancelar el evento.En este caso, no es necesario cambiar el código entre navegadores. –

Cuestiones relacionadas