2008-11-13 5 views
16

Ich versuche, eine wiederverwendbare JS- oder jQuery-Funktion zu entwickeln, mit der ich testen kann, ob ein Objekt ein DOM-Nachfolger eines anderen ist.Testen von Objekten für Vorfahren/Nachkommen in JavaScript oder Jquery

Ich habe für

$b.parents('nodename').length>0 

ein Modell des Tests gesehen, was fantastisch ist, wenn Sie nur überprüfen müssen, ob ein Element ein Kind von jedem Knoten mit diesem Namen ist.

Aber was ist mit einem bestimmten Knoten? Sie können nicht testen

$b.parents($a).length>0 

Da jQuery Eltern einen knotenname -Ausdruck als Argument zu filtern.

Als kleinen Hintergrund versuche ich zu testen, ob das Ziel eines Dokument-Klick-Ereignisses ein Kind eines bestimmten Objekts ist. Wenn das event.target beispielsweise ein Kind von $ b ist, geben Sie true zurück, andernfalls geben Sie false zurück. Aber diese Funktion könnte später andere Auswirkungen haben.

Danke!

Antwort

12

In jQuery ancestors using jQuery objects schlug ich

if ($(obj1).parents().index($(obj2)) >= 0) { 
    // obj1 is a descendant of obj2 
} 
+1

Perfekt. Dieser erlaubt tatsächlich das Übergeben eines Objekts anstelle eines Selektors, was fantastisch ist. Danke noch einmal! – dreisch

+4

Sie können ein unverpacktes DOM-Element zum Index übergeben, so dass dies vereinfacht werden könnte, wenn ($ (obj1) .parents(). Index (obj2)> = 0) –

+0

Es gibt jetzt ein $ .contains, wenn Sie sich sorgen Knoten.enthält. –

2

starten:

$('#foo').filter(function(){ 

    return $(this).parent().is('#foo-parent'); 

}); 

So hier sind wir alle foo Elemente auswählen und dann Filterung nur die Elemente, die die foo-Eltern als ihre unmittelbaren Elternteil haben.

Wenn Sie zu finden suchen, wenn die eine der Vorfahren des aktuellen Objekts auf die Regel erfüllen, dann denke ich, es sein sollte:

$('#foo').filter(function(){ 

    return $(this).parents().is('#foo-parent'); 

}); 
21
a.contains(b) 

Dies ist eine reine JavaScript-Lösung mit Node.contains. Die Funktion ist inklusive, a.contains(a) wird als wahr ausgewertet.

In IE9 gibt es einen Randfall: Wenn b ein Textknoten ist, gibt contains immer false zurück.

+5

Das ist großartig! Für mich geht das. Ich bevorzuge immer reines JS gegenüber Frameworks. – Firas

Verwandte Themen