2012-06-05 18 views
33

E 'necessario verificare se esiste una classe prima che io uso il removeClass api su un oggetto jQuery? es.Qualora hasClass precedono removeClass - jQuery

if($(this).hasClass("test")) 
    $(this).removeClass("test"); 

o

$(this).removeClass("test"); 

se non necessario, perché così?

+0

Hai provato se funziona in entrambi i modi? Fatto? – lanzz

+0

bene jquery evita l'errore di lancio nella maggior parte dei casi e sì funziona – user917670

+0

Poiché funziona e non produce errori, apparentemente non è necessario. Non dovresti provare a gestire la gestione delle eccezioni secondo il codice di terze parti - se non lascia che un'eccezione venga ignorata, allora è stata gestita. – lanzz

risposta

36

Usa proprio questo:

$(this).removeClass("test"); 

Non c'è bisogno di controllare per la classe esistenza.

Da jQuery sources possiamo vedere che removeClass metodo utilizza replace metodo per rimuovere la stringa:

className = (" " + elem.className + " ").replace(rclass, " "); 
for (c = 0, cl = classNames.length; c < cl; c++) { 
    className = className.replace(" " + classNames[c] + " ", " "); 
}​ 

E replace non rimuoverà nulla se la sottostringa corrispondente non esiste.

+1

che spiega le cose. grazie – user917670

+1

+1 per una grande spiegazione – thecodeparadox

+1

Il 'hasClass' potrebbe non essere necessario per la corretta funzionalità ma alcuni test rapidi mostrano che è più veloce da controllare prima (almeno per me su tre diversi browser) - https://jsfiddle.net/trevorpower/5mu7shg1/2/ – tpower

3

No, non necessario controllare removeClass().

Basta usare

$(this).removeClass("test"); 
5

Almeno per Chrome, è utile aggiungere una hasClass() controllare prima removeClass(), perché jQuery assegna incondizionatamente elem.className alla nuova stringa, anche se la stringa hasn' t cambiato, il che fa sì che Chrome invalidi e ricalcoli il layout.

Si potrebbe obiettare che si tratta di un bug in Chrome e dovrebbe verificare se il className ha effettivamente cambiato rispetto al valore precedente. Tuttavia, potrebbe anche essere che il browser abbia per ricalcolare il layout a causa di alcuni requisiti oscuri che sono stati scritti da qualche parte nelle specifiche html.

Non ho testato Firefox. La web inspector di Safari è inutile in quanto non ti dirà perché il layout è stato invalidato/ricalcolato (quale funzione javascript lo ha causato).

+1

È ancora valido per Chrome? – Lipis

Problemi correlati