2010-09-12 1 views
5

J'ai des éléments DOM que je voudrais exclure d'une fonction .click en ajoutant une classe "noEdit" le problème que je rencontre est que certains de ces éléments ont plusieurs classes :jQuery et si l'instruction ne correspond pas en raison de plusieurs classes

<td class="firstCol noEdit"> // <-- wont work 
<td class="noEdit"> // <-- works fine 

Et le jQuery:

$('td').click(function(){ 
    if($(this).attr('class') != "noEdit"){ 
     alert('do the function'); 
    }); 

pensées?

Répondre

6

Si vous interrogez l'attribut class avec attr(), il renvoie simplement la valeur en tant que chaîne unique. La condition échoue pour votre premier <td> parce que votre code tentera de comparer

"firstCol noEdit" != "noEdit" 

qui retourne vrai (car ils ne sont pas égaux) et provoque votre alerte à afficher.

Vous aurez envie de regarder la place fonction hasClass(), qui analyse la liste des classes pour vous et vérifie la présence de la classe donnée dans l'attribut:

$('td').click(function() { 
    if (!$(this).hasClass("noEdit")) { 
     alert('do the function'); 
    } 
}); 
+0

deux bonnes réponses, j'étais plus à la recherche de celui-ci, car je peux effectuer une autre fonction avec mes cibles d'événements qui ont la classe noEdit. Merci :) –

+0

@Jascha: ce serait trois bonnes réponses; Dave vient de poster;) – BoltClock

4

Que diriez-vous à l'aide d'un filtre d'attribut:

// != means 'not exactly matching', whereas *= means 'contains' 
$('td[class!=noEdit]').click(function(){ 
    alert('do the function'); 
}); 
+2

Cela semble beaucoup plus propre (la condition if n'est plus nécessaire puisque OP ne veut que filtrer les choses en fonction uniquement de la classe 'noEdit'). +1 – BoltClock

+0

@Boltclock - Heh, je me rends compte que j'ai laissé l'instruction 'if' dans la réponse. Comme c'est stupide. (corrigé maintenant, mais ...) – karim79

+1

hasClass peut être plus rapide cependant, .... Il vaudrait la peine de vérifier la vitesse de ceci par rapport à cela. –

3

Vous pouvez utiliser jQuery's not() traversal pour nettoyer ça:

$('td').not('.noEdit').click(function() { 
    alert('do the function'); 
}); 
+0

Ceci est viable (et peut-être) plus rapide que les deux approches ci-dessus, car il utilise les méthodes de liste de jQuery plutôt que le truc de moteur de sélection sizzle. +1 – karim79

+0

@ karim79: 'not()' n'utilise pas Sizzle? C'est intéressant! – BoltClock

+0

@Boltclock - Je pense que c'est le cas (pensez! = Savoir) mais je suis trop fainéant pour vérifier à ce moment précis :) – karim79

Questions connexes