2010-03-01 5 views
3

jQuery 1.4:jQuery: non() question

$('#menu li:last:not(.ignore)').addClass('last'); 

HTML:

<div id="menu"> 
    <ul> 
     <li>item 1</li> 
     <li>item 2</li> 
     <li class="ignore">item3</li> 
    </ul> 
</div> 

.. last classe n'est pas appliquée à item 2. Qu'est-ce que je fais mal ici?

Merci

Répondre

5

Changer l'ordre de :last et :not():

$('#menu li:not(.ignore):last') 
+0

Ah! J'avais rejeté cette pensée parce que: dernier: pas travaillé plus tôt, mais pas dans jquery 1.4 je suppose. Merci quand même!! :) – 3zzy

+0

@Nimbuz: Les sélecteurs ': not (...): last' et': last: not (...) 'ont des sémantiques différentes. Le premier exclura d'abord tous les éléments qui ne correspondent pas à l'expression ': not (...)' et obtiendra ensuite le dernier élément. Ce dernier obtiendra d'abord le dernier élément et l'exclura s'il ne correspond pas à la condition ': not (...)'. – Gumbo

2

La façon dont votre expression fonctionne est la suivante:

  • Trouver l'élément avec ID "menu"; Trouvez tous les éléments de la liste des descendants de cet élément; Limiter les résultats au tout dernier élément de cet ensemble;
  • Éléments de filtrage (qui n'est qu'un élément à ce stade, le dernier) qui n'ont pas de classe d'ignorer.

Le dernier élément a une classe d'ignorer de sorte qu'il est filtré. C'est pourquoi ça ne marche pas. Inverser l'ordre:

$("#menu li:not(.ignore):last").addClass("last"); 
0

Il me semble plus logique d'au moins dire 'me faire l'élément de liste avant la première apparition de .ignore':

// tested 
$("#menu li.ignore:first").prev("li").addClass('last');