2012-06-05 2 views
33

Est-il nécessaire de vérifier si une classe existe avant d'utiliser l'API removeClass sur un objet jquery? par ex.Est-ce que hasClass doit précéder removeClass - jQuery

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

ou

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

sinon nécessaire, pourquoi?

+0

Avez-vous essayé si cela fonctionne de toute façon? L'a fait? – lanzz

+0

bien jquery évite erreur de lancer dans la plupart des cas et oui cela fonctionne – user917670

+0

Comme il fonctionne et ne produit pas d'erreurs, apparemment, il n'est pas nécessaire. Vous ne devriez pas essayer de deviner la gestion des exceptions dans le code d'une tierce partie - si elle ne laisse pas une exception s'échapper, elle a été gérée. – lanzz

Répondre

36

Utilisez ceci:

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

Il n'y a pas besoin de vérifier l'existence de la classe.

De jQuery sources nous pouvons voir que la méthode removeClass utilise la méthode replace pour supprimer la sous-chaîne:

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

Et replace ne supprimera pas rien si la sous-chaîne correspondant n'existe pas.

+1

qui explique les choses. Merci – user917670

+1

+ 1 pour une bonne explication – thecodeparadox

+1

Le 'hasClass' peut ne pas être nécessaire pour la fonctionnalité correcte, mais certains tests rapides montre qu'il est plus rapide à vérifier en premier (au moins pour moi sur trois navigateurs différents) - https://jsfiddle.net/trevorpower/5mu7shg1/2/ – tpower

3

Non, il n'est pas nécessaire de vérifier removeClass().

Il suffit d'utiliser

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

au moins pour Chrome, il est utile d'ajouter un hasClass() vérifier avant removeClass(), parce que jQuery attribue inconditionnellement elem.className à la nouvelle chaîne, même si la chaîne hasn » t modifié, ce qui entraîne l'invalidation de Chrome et le recalcul de la mise en page.

On pourrait argumenter que c'est un bogue dans Chrome et il devrait vérifier si le nom de classe a effectivement changé de la valeur précédente. Cependant, il se peut aussi que le navigateur ait pour recalculer la mise en page en raison de certaines exigences obscures qui sont écrites quelque part dans la spécification html.

Je n'ai pas testé Firefox. L'inspecteur Web Safari est inutile car il ne vous dira pas pourquoi la mise en page a été invalidée/recalculée (quelle fonction javascript l'a provoquée).

+1

Est-ce toujours valide pour Chrome? – Lipis