2009-10-28 7 views
9

Ho un pulsante e la seguente routine javascript.Perché la restituzione di false nella loro richiamata del keydown non interrompe l'evento click del pulsante?

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

come ho capito, la return false; sarebbe fermare la pressione del tasto venga elaborato. Quindi, $("button").click(); non verrebbe chiamato. Per altri keycode questo funziona come previsto. Ad esempio se intercetto 40, che è il pulsante giù, la pagina non sta scorrendo.

Ho notato questo comportamento in firefox.

Perché lo return false; non interrompe l'evento di clic sul pulsante nello spazio? Che cosa dicono le specifiche javascript?

+1

in realtà dice "ritorno fale" nel tuo codice reale? Se è così, potrebbe essere il tuo problema. fale. – rmeador

+0

Nel tuo snippet di codice hai "return fale;" - è questo il codice così com'è? se è così è un errore di battitura. – artlung

+0

No, il mio vero codice restituisce false. In realtà uso questo codice per intercettare altri pulsanti come giù, e funziona per loro. – johannes

risposta

13

Spero che questo risponde alla tua domanda:

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

return false; annulla con successo un evento tra i browser se chiamato alla fine di un attributo del gestore di eventi nel codice HTML. Questo comportamento non è formalmente specificato da nessuna parte, per quanto ne so.

Se invece si imposta un evento tramite una proprietà di gestore di eventi sull'elemento DOM (ad es button.onkeydown = function(evt) {...}) oppure utilizzando addEventListener/attachEvent (ad es button.addEventListener("keydown", function(evt) {...}, false)) poi basta tornare false da quella funzione non funziona in tutti i browser ed è necessario fare il returnValue e il preventDefault() roba dalla mia altra risposta. preventDefault è specificato nello DOM 2 spec ed è implementato dalla maggior parte dei browser moderni tradizionali. returnValue è specifico per IE.

+0

Nel mio modulo asp.net, si spegne ancora l'aggiornamento della pagina. – Si8

+1

@ Si8: Ciò potrebbe accadere se l'equivalente di 'doOtherStuff()' sopra genera un errore. –

6

Innanzitutto, se stai rilevando un carattere stampabile come lo spazio, starai meglio con l'evento keypress. In secondo luogo, il modo per prevenire l'azione predefinita è chiamare preventDefault() sull'evento nei browser non-IE e impostare la proprietà returnValue dell'evento su false in 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; 
     } 
    } 
}; 

Io non sono un esperto di jQuery e presumo si prende cura di ottenere l'evento per voi:

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

L'ho provato, e 'key.preventDefault();' non cambia nulla in firefox. 'keydown' rileva i tasti, che producono caratteri stampabili, quindi cosa non va con' keydown'? – johannes

+0

OK. Qual è l'HTML che produce il pulsante? Sei sicuro che il gestore della tastiera venga chiamato? Nel caso dello spazio, probabilmente stai usando OK 'keydown' e' keyCode' 32, ma in generale con caratteri stampabili usando 'keypress' si evita qualsiasi potenziale differenza tra tastiere o altri dispositivi di input estraendo il carattere derivante da il tasto premuto anziché un codice corrispondente a un tasto su un dispositivo di input. –

+0

@Tim: l'esempio di codice originale OPs è valido jQuery per annullare l'evento.In questo caso non è necessario il normale passaggio del codice cross-browser. –