2012-04-12 8 views
0

Ich habe folgende HTML:JQuery: liest-child Einkapseln Eltern von verschachteltem Elemente

//'[popup]' hook nested at random depths, using <ul> or <ol>, no classes or id's 
<ol> 
    <li>Blah</li> 
    <li>Blah</li> 
    <li>Foo 
     <ol> 
      <li>[popup]Bar</li> 
     </ol> 
    </li> 
</ol> 

Ich wünsche den [popup] Haken zielen, und gibt ihre <li> Klassen von Popup, Pop/n. Ich möchte dann seinem Elternteil (Foo)<li> verschiedene Pfeilklassen geben, arr/n. Hier

ist der Code:

var num = 0; 

//Find [popup] instances, increment the number 
$("li:contains('[popup]') li:last-child").each(function() { 
    var nextnumber = num++; 

    //add a general and a unique class to the list item containing the hook 
    $(this).addClass('popup' + ' ' + 'pop' + nextnumber); 

    //Get the parent list item, and give it general and unique classes also. 
    $thisArrow = $(this).parent().parent(); 
    $thisArrow.addClass('arrow' + ' ' + 'arr' + nextnumber); 

}); 

das kein Problem für Ziele arbeiten verschachtelt eine Ebene tiefer, aber nicht darüber hinaus. Wenn sie mit einer Liste dargestellt, wo das Ziel zwei Ebenen tief verschachtelt ist, geschieht folgendes:

<ol> 
    <li>Blah</li> 
    <li class="popup pop1 arrow arr1">Blah 
     <ol> 
      <li class="arrow arr0">Foo 
       <ol> 
        <li class="popup pop0">[popup]Bar</li> 
       </ol> 
      </li> 
      <li class="arrow arr2">Foo 
       <ol> 
        <li class="popup pop2">[popup]Bar</li> 
       </ol> 
      </li> 
     </ol> 
    </li> 
</ol> 

Sie können sehen, dass, sobald die letzte (immer das letzte Vorkommen in der Liste): Last-Kind-Element erreicht wurde, Irgendwie erhielt das Elternelement seiner Eltern die Klassen für Ziel und Eltern, dann die Klassen wurden selbst hinzugefügt.

Wenn jemand auf meinen Fehler hinweisen könnte, wäre ich sehr dankbar.

(Ich habe versucht, .parents().eq(1); statt .parent().parent() zu dem gleichen Ergebnis.)

+0

Könnten Sie versuchen, das Ergebnis, das Sie wollten zu schreiben, damit wir es zu dem, was Sie vergleichen bekam. Ich bin ein wenig verwirrt von dem, was Sie erreichen wollen - erstellt ein JsFiddle mit Ihrer Quelle http://jsfiddle.net/Jg9kv/ –

+0

@Marco Apologies - tatsächlichen Anwendungsfall hier. Abschnitt A ist was ich will, Abschnitt D ist was passiert, wenn das Ziel weiter als eine Ebene verschachtelt ist. http://databizsolutions.ie/contents/page.php?v=35&u=admin-videos#d – Eamonn

Antwort

2

nicht zu 100% sicher, ob der Pfeil Sache, aber ich denke, dass Ihr Hauptproblem war, dass verschachtelte li Inhalt würde auch durch die gezielte erhalten: enthält

Test auf den Textinhalt für "beginnend mit [popup]" kann helfen.

var num = 0; 

//Find [popup] instances, increment the number 
$("li:contains('[popup]')").each(function() {  
    if($(this).text().indexOf("[popup]")==0){ 
    var nextnumber = num++; 
    $(this).addClass('popup' + ' ' + 'pop' + nextnumber); 
} 

});​ 

Siehe hier: http://jsfiddle.net/r3wK4/

mich tun sagen, wenn ich nicht das Problem verstanden hat :-)

+0

Das sieht gut aus, +1 sowie ich war nicht bewusst von indexOf - löste das Problem! – Eamonn

+0

Super! Froh, dass ich Helfen kann :-) – Steen