5 Stimmen

JQuery - Abrufen der übergeordneten div aus einer verschachtelten Element-ID

Ich versuche, auf ein Element zuzugreifen, indem ich eine ID von einem seiner verschachtelten Elemente mit JQuery verwende. Zum Beispiel: Ich muss "myDiv" von seinem verschachtelten "searchBox" Element finden. Das Problem ist, dass die Hierarchie ändert und die searchBox wird nicht immer in der gleichen verschachtelten Position sein. so brauche ich im Wesentlichen etwas, das sagt: Gib mir das DIV, das das Element mit der ID von 'searchBox' enthält.(siehe unten) Irgendwelche Vorschläge? Danke!

<div id="myDiv" class="CommonGridView_ListBoxPopupPanel"> 
Some text here : 
<table><tbody><tr><td><input class="tboxw" type="text" id="btnFind"/></td>  
 <td>some content</td> </tr> 
 <tr> <td><textarea id="searchBox">text area content</textarea> </td> 
 </tr> 
 </tbody> 
</table> 
<table><tr><td></td></tr></table>
</div>

10voto

Jeff Meatball Yang Punkte 35809

Wenn Sie das umhüllende DIV-Element finden wollen (unabhängig von der ID auf diesem DIV), dann werden Sie diesen jQuery-Selektor benötigen:

$("#searchBox").closest("div");

Die c losest([Selektor]) Funktion findet das umhüllende Element, das dem Selektor entspricht.

0 Stimmen

"Die Funktion closest([Selektor]) findet alle umschließenden Elemente, die dem Selektor entsprechen." - Nein, es wird nur das nächstgelegene gefunden. closest wird niemals > 1 Elemente zurückgeben.

0 Stimmen

Vielen Dank für die Klarstellung, Paolo - ich habe mich in Bezug auf die engste Stelle geirrt und meine Antwort geändert.

0 Stimmen

Es ist okay, ich tatsächlich falsch gesprochen zu: closest kann zurückgeben > 1, wenn der $(Selektor) Teil davon mehr als 1 Element zurückgibt (es würde die engsten von jedem der Selektor-Elemente zurückgeben)

6voto

chaos Punkte 118918
$('#searchBox').parents('#myDiv')

0 Stimmen

0 Mein Fehler. Ich muss das "s" übersehen haben.

2voto

redsquare Punkte 76970

Wenn Sie die ID kennen und sich daran erinnern, dass IDs eindeutig sein müssen, nehmen Sie einfach das Element wie Sie es normalerweise tun würden.

var $parentDiv = $('#searchBox');

Es gibt keinen Vorteil aus der Verwendung von .parents, wie die Antworten oben zeigen, da es nur langsamer ist, da es alle Eltern in der Hierarchie und Filter auf sie, anstatt mit getElementById bekommt. Wenn Sie zum Beispiel nur den Klassennamen kennen, dann wäre es am besten, wenn Sie .closest('div.class') als das jedes Elternteil oben eine nach der anderen, bis eine Übereinstimmung gefunden wird.

Das einzige Mal, dass Sie .closest verwenden würden, wäre, wenn Sie sicherstellen wollten, dass searchBox tatsächlich ein Elternteil Ihres Elements ist.

if ( $element.closest('#searchBox').length ){
     //do something
}

0 Stimmen

Ich habe John Resig noch einmal nach dem Tag#id-Zeug gefragt und er sagte, dass es wie erwartet funktioniert. Der Grund dafür, dass es mehr Aufrufe gibt, ist, dass es auch den nodeName überprüfen muss, so dass man theoretisch span#myid und div#myid (nicht gleichzeitig) machen könnte - ich verstehe immer noch nicht, warum es so viele weitere Aufrufe sind, aber er sagt, dass es in Ordnung ist, also bin ich geneigt, ihm zu glauben.

0 Stimmen

Was aber, wenn ich die ID des DIVs nicht kenne, sondern nur das untergeordnete Element?

0 Stimmen

Sie können einen beliebigen CSS-Selektor verwenden, es muss sich nicht um eine ID handeln .closest('div.someclass') usw.

1voto

Emre Erkan Punkte 8332

Sie können verwenden

$('#searchBox').parents('div:first')

ou

$('#searchBox').parents('div:eq(0)')

0voto

Peter Punkte 6304

Sie können dies verwenden:

var searchBox = $('#searchBox');

// Have the searchBox jQuery object, so find the ancestors that match a specific selector.
var parentDiv = searchBox.parents('div#myDiv');

Die vollständige Dokumentation ist hier erhältlich .

0 Stimmen

Btw, die Verwendung von nodeName#id ist langsamer als die bloße Angabe der id

0 Stimmen

@redsquare: Eigentlich nicht, jQuery ist so optimiert, dass es diesen Fehler verzeiht und nur nach der ID sucht. (Ich habe John Resig selbst dazu befragt)

0 Stimmen

Ich habe es selbst getestet und kann Ihnen versichern, dass es so war. Ich werde eine Demo machen, wenn ich zur Arbeit komme.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X