2012-06-05 10 views
33

¿Es necesario verificar si existe una clase antes de usar la api removeClass en un objeto jquery? por ej.Debe haveClass antes de eliminarClass - jQuery

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

o

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

si no es necesario, ¿por qué?

+0

¿Has probado si funciona de cualquier manera? ¿Lo hizo? – lanzz

+0

bien jquery evita el error de lanzamiento en la mayoría de los casos y sí funciona – user917670

+0

Dado que funciona y no produce errores, aparentemente no es necesario. No debe tratar de adivinar el manejo de excepciones en código de terceros; si no permite que una excepción escape sin ser detectada, entonces se ha manejado. – lanzz

Respuesta

36

Uso simplemente esto:

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

No hay necesidad de comprobar la existencia de clases.

De jQuery sources podemos ver que removeClass método utiliza replace método para eliminar la subcadena:

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

Y replace no quitará nada si la subcadena coincidente no existe.

+1

que explica las cosas. gracias – user917670

+1

+1 para una gran explicación – thecodeparadox

+1

El 'hasClass' puede no ser necesario para la funcionalidad correcta, pero algunas pruebas rápidas muestran que es más rápido verificar primero (al menos para mí en tres navegadores diferentes) - https://jsfiddle.net/trevorpower/5mu7shg1/2/ – tpower

3

No, no es necesario comprobar removeClass().

Sólo tiene que utilizar

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

Al menos para Chrome, es útil añadir un hasClass() comprobar antes removeClass(), porque jQuery asigna incondicionalmente elem.className a la nueva cadena, incluso si la cadena hasn' t cambiado, lo que provoca que Chrome invalide y vuelva a calcular el diseño.

Se podría argumentar que este es un error en Chrome y debería verificar si className en realidad ha cambiado desde el valor anterior. Sin embargo, también podría ser que el navegador tenga para volver a calcular el diseño debido a algunos requisitos poco claros que están escritos en algún lugar profundo de la especificación html.

No he probado Firefox. El inspector web de Safari es inútil ya que no le indicará por qué el diseño fue invalidado/recalculado (qué función de JavaScript lo causó).

+1

¿Sigue siendo válido para Chrome? – Lipis

Cuestiones relacionadas