2008-10-14 7 views
13

In meiner Javascript-Erfahrung fand ich, dass es eine sehr häufige Aufgabe ist, "den nächsten Vorfahren eines Elements mit einer Bedingung (Tag-Name, Klasse, ...) zu suchen". Kann die Methode eltern() von jquery die Aufgabe übernehmen? Die Reihenfolge der zurückgegebenen Elemente von eltern() ist vorhersagbar? Ist von oben nach unten oder von unten nach oben? Für den Moment, wo ich diese Dienstprogramm-Funktion:nächster Vorfahrknoten in jQuery

function ancestor(elem, selector) { 
    var $elem = $(elem).parent(); 
    while($elem.size() > 0) { 
    if($elem.is(selector)) 
    return $elem; 
    else 
     $elem = $elem.parent(); 
    } 
    return null; 
} 

Kann mir jemand sagen, ob es ein kluger Weg, um die Arbeit zu tun?

Antwort

20

Bearbeiten: Seit jQuery 1.3 wurde dies als die closest()-Funktion eingebaut. zB: $('#foo').closest('.bar');


yep - Eltern() durchläuft den Baum.

<div id="a"> 
    <div id="b"> 
     <p id="c"> 
      <a id="d"></a> 
     </p> 
    </div> 
</div> 

$('#d').parents("div:first"); wird div b auswählen.

+2

Vorsicht, John Resig plant, Ändern Sie .parents(), um Elemente in der Quellreihenfolge zurückzugeben. Sehen Sie sich diesen Fehler an, der von John selbst gestellt wurde, nachdem der Forum-Thread sich um die Elementreihenfolge in zurückgegebenen Sammlungen drehte: http://bugs.jquery.com/ticket/5994 –

+4

Glücklicherweise hat das jQuery-Team dieses Ticket seitdem mit 'wontfix' geschlossen. So sollte .parents() wieder als stabil betrachtet werden. –

16

Hinzufügen zu @nickf ‚s Antwort:

jQuery 1.3 simplifyed diese Aufgabe mit closest.

ein DOM Gegeben:

<div id="a"> 
    <div id="b"> 
     <p id="c"> 
      <a id="d"></a> 
     </p> 
    </div> 
</div> 

Sie tun können:

$('#d').closest("div"); // returns [ div#b ] 

[Closest kehrt a] Satz von Elemente der nächsten übergeordneten Element enthält, das den angegebenen Selektor entspricht, das Startelement enthalten.

+0

Das Problem mit .closes() ist, dass es am aktuellen Element beginnt. Von der [jQuery-Site] (http://api.jquery.com/closest/): "Holen Sie sich das erste Element, das mit dem Selektor übereinstimmt, beginnend mit dem aktuellen Element, und durchlaufen Sie den DOM-Baum."Im Allgemeinen wird dies die Frage nicht korrekt beantworten, da nur nach Vorgängerelementen gesucht wird. –

3

sollten Sie closest verwenden, da parents werden Sie nicht das gewünschte Ergebnis erwarten geben, wenn Sie mit mehreren Elementen arbeiten sind. Zum Beispiel, sagen wir, Sie haben dies:

<div id="0"> 
     <div id="1">test with <b>nested</b> divs.</div> 
     <div id="2">another div.</div> 
     <div id="3">yet <b>another</b> div.</div> 
    </div> 

und Sie eine Klasse, um die divs hinzuzufügen, die ein <b> Element als ihre unmittelbaren Kind haben (dh 1 und 3). Wenn Sie $('b').parents('div') verwenden, erhalten Sie divs 0, 1 und 3. Wenn Sie $('b').parents('div:first') verwenden, erhalten Sie nur div 1. Um 1 und 3, aber nicht 0 zu erhalten, müssen Sie $('b').closest(elem) verwenden.

+0

Das Problem mit .closes() ist, dass es beim aktuellen Element beginnt. Von der [jQuery-Site] (http: // api .jquery.com/nearest /): "Holen Sie sich das erste Element, das mit dem Selektor übereinstimmt, beginnend mit dem aktuellen Element, und durchlaufen Sie den DOM-Baum." Im Allgemeinen wird die Frage nicht korrekt beantwortet, da nach Vorfahren gesucht wird nur Elemente. –

3

am nächsten() beginnt bei aktuellem Elemente, wenn die übergeordnete Sie suchen, den gleichen Tag wie Strom hat (z. B. beide sind divs), verwendet parent(). Am nächsten()