2016-02-14 9 views
22

Secondo MDN, dovremmo assolutamente non utilizzare la proprietà .keyCode. Si è deprecato:codice chiave JavaScript deprecato. Cosa significa in pratica?

https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode

sulle scuole w3, questo fatto è iniziata e c'è solo un lato nota dicendo che .keyCode è previsto solo per compatibilità e che l'ultima versione della specifica DOM Eventi consiglia di utilizzare il .key proprietà invece.

Il problema è che .key non è supportato dai browser, quindi cosa dovremmo usare? C'è qualcosa che mi manca?

+1

Potrebbe per favore rispondere in modo corretto, quindi questa domanda non viene visualizzata di nuovo? –

risposta

7

avete tre modi per gestire, come è scritto sul link che hai condiviso.

if (event.key !== undefined) { 
 
    
 
} else if (event.keyIdentifier !== undefined) { 
 
    
 
} else if (event.keyCode !== undefined) { 
 
    
 
}

li si dovrebbe contemplare, questo è il modo giusto, se si desidera il supporto cross browser.

Potrebbe essere più semplice se si implementa qualcosa di simile.

var dispatchForCode = function(event, callback) { 
 
    var code; 
 
    
 
    if (event.key !== undefined) { 
 
    code = event.key; 
 
    } else if (event.keyIdentifier !== undefined) { 
 
    code = event.keyIdentifier; 
 
    } else if (event.keyCode !== undefined) { 
 
    code = event.keyCode; 
 
    } 
 
    
 
    callback(code); 
 
};

+1

L'ho letto ma sembra che ci sia un sacco di codice in più per nessun altro motivo se MDN ha detto che qualcosa è deprecato, quando in realtà funziona bene su tutti i principali browser. Ma se è così, grazie! – Jason210

+1

Wow guarda questo. http://caniuse.com/#search=keyCode (Questa proprietà KeyboardEvent è supportata in modo efficace in tutti i browser (da IE6 +, Firefox 2+, Chrome 1+ ecc. "parlando di .keyCode) –

+1

Questo è ciò che è così fastidioso in tutto questo. Tutti i principali browser supportano keyCode, ma prova a fare un controllo per la proprietà .key, che è quella consigliata, e quasi nessuno lo usa! – Jason210

6

MDN ha già fornito una soluzione:

https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode

window.addEventListener("keydown", function (event) { 
    if (event.defaultPrevented) { 
    return; // Should do nothing if the default action has been cancelled 
    } 

    var handled = false; 
    if (event.key !== undefined) { 
    // Handle the event with KeyboardEvent.key and set handled true. 
    } else if (event.keyIdentifier !== undefined) { 
    // Handle the event with KeyboardEvent.keyIdentifier and set handled true. 
    } else if (event.keyCode !== undefined) { 
    // Handle the event with KeyboardEvent.keyCode and set handled true. 
    } 

    if (handled) { 
    // Suppress "double action" if event handled 
    event.preventDefault(); 
    } 
}, true); 
+1

Signore, non sembri capire la domanda. –

+0

Grazie @ Bálint Correggetto che –

+2

Non è quello che definirei una soluzione, ma piuttosto un suggerimento per aggirare un problema che gli stessi MDN hanno creato ... ma grazie. – Jason210

1

fare quello che faccio. Semplicemente non mi interessa. MDN può dire che è deprecato, ma se non forniscono un'alternativa (eccetto keyIdentifier), allora devi usare la versione deprecata.

+1

Questo è quello che stavo facendo ... – Jason210

+4

'Non mi interessa' non è molto utile qui. Deprecato può significare che il supporto sparirà a un certo punto nel prossimo futuro, non necessariamente immediatamente. – poepje

+0

'keyIdentifier' è deprecato pure. –

4

Oltre che tutti keyCode, which, charCode e keyIdentifier sono obsoleti:
charCode e keyIdentifier sono caratteristiche non standard.
keyIdentifier viene rimosso da Chrome 54 e Opera 41.0
keyCode restituisce 0, sull'evento di pressione tasti con caratteri normali su FF.

The key property:

readonly attribute DOMString key 

contiene un valore di attributo tasto corrispondente al tasto premuto

Al momento di questa scrittura, la proprietà key è supportato da tutti i principali browser come di : Firefox 52, Chrome 55, Safari 10.1, Opera 46. Tranne Internet Explorer 11 che ha: Identificatori di chiavi non standard e comportamento errato con AltG Raph.More info
Se questo è importante e/o la compatibilità a ritroso è, quindi è possibile utilizzare il rilevamento funzione come nel codice seguente:

Si noti che il valore key è diverso da keyCode o which immobili a che: contiene il nome della chiave, non il suo codice. Se il tuo programma richiede i codici dei caratteri, puoi utilizzare charCodeAt(). Per i singoli caratteri stampabili è possibile utilizzare charCodeAt(), se si ha a che fare con chiavi i cui valori contengono più caratteri come ArrowUp è probabile che si stiano verificando chiavi speciali e si eseguano azioni di conseguenza. Quindi provare l'attuazione di una tabella di valori chiavi e la loro corrispondente codici charCodeArr["ArrowUp"]=38, charCodeArr["Enter"]=13, charCodeArr[Escape]=27 ... e così via, si prega di dare un'occhiata al Key Values e la loro corresponding codes

if(e.key!=undefined){ 
     var characterCode = charCodeArr[e.key] || e.key.charCodeAt(0); 
    }else{ 
     /* As @Leonid suggeted */ 
     var characterCode = e.which || e.charCode || e.keyCode || 0; 
    } 
     /* ... code making use of characterCode variable */ 

Può essere che si desidera prendere in considerazione in avanti compatibilità cioè utilizzare le proprietà legacy mentre sono disponibili, e solo quando è sceso interruttore per quelli nuovi:

if(e.which || e.charCode || e.keyCode){ 
     var characterCode = e.which || e.charCode || e.keyCode; 
    }else if (e.key!=undefined){ 
     var characterCode = charCodeArr[e.key] || e.key.charCodeAt(0); 
    }else{ 
     var characterCode = 0; 
    } 

Vedi anche: la KeyboardEvent.code proprietà docs e alcuni altri dettagli in questo answer.

+0

La soluzione non funziona nel mio browser (Windows 10, Chrome 60, tastiera belga). Prima di tutto, la funzione 'charCodeArr' non esiste.Inoltre, 'charCodeAt' non funziona per tutti i valori di' e.key'. Ad esempio, per la chiave 'Enter' /' Return', il valore della proprietà 'e.key' è' "Enter" ', e l'esecuzione di' charCodeArr' per quella stringa restituisce il valore '69' (che è il codice ASCII per il personaggio 'E'). –

+0

@JohnSlegers, sì che era un refuso, intendevo un array costruito dall'utente. Per favore, vedi la mia risposta aggiornata per maggiori dettagli. – user10089632