2011-10-19 12 views
68

W porządku, wcześniej programowałem JavaScript, ale najbardziej użyteczną rzeczą, jaką napisałem, jest przełącznik stylu CSS. Więc jestem trochę nowy w tym. Załóżmy, że mam kod HTML podobny do tego:Pobierz element wewnątrz elementu według klasy i ID - JavaScript

<div id="foo"> 
    <div class="bar"> 
     Hello world! 
    </div> 
</div> 

Jak zmienić "Witaj, świecie!" do "Do widzenia na świecie!" ? Wiem, jak działają document.getElementByClass i document.getElementById, ale chciałbym uzyskać bardziej szczegółowe informacje. Przepraszam, jeśli wcześniej zostało to zadane.

Odpowiedz

126

Cóż, najpierw trzeba wybierz elementy z funkcją taką jak getElementById.

var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0]; 

getElementById zwraca tylko jeden węzeł, ale getElementsByClassName zwraca listę węzłów. Ponieważ istnieje tylko jeden element o tej nazwie klasy (o ile mogę powiedzieć), możesz po prostu dostać pierwszy (do tego służy [0] - to tak jak tablica).

Następnie można zmienić kod HTML za pomocą .innerHTML.

targetDiv.innerHTML = "Goodbye world!"; 

var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0]; 
 
targetDiv.innerHTML = "Goodbye world!";
<div id="foo"> 
 
    <div class="bar"> 
 
     Hello world! 
 
    </div> 
 
</div>

+1

Uzyskanie statusu rodzica według identyfikatora nie jest w tym przypadku konieczne. "document.getElementsByClassName" działałoby poprawnie. – rvighne

+6

@rvighne dokładne wymagania OP było to, że "chciałby uzyskać bardziej szczegółowe". Osoba zadająca pytanie zastanawiała się, w jaki sposób może być bardziej konkretny w swoim przemierzaniu drzewa DOM. Używanie getElementByClassName nie było punktem dezorientacji, ale widzę, jak ktoś mógłby łatwo pomyśleć, że wskazywałam oba w razie potrzeby. Oni nie są. Jeśli chcesz kierować tylko na elementy określonej klasy, które znajdują się pod określonym węzłem o danym ID, w przeciwieństwie do elementów tej samej klasy pod innym węzłem, użyjesz tego. –

+1

@JosephMarikle Rozumiem. Uważam, że zbyt szybko przeczytałem to pytanie. – rvighne

10

Można to zrobić tak:

var list = document.getElementById("foo").getElementsByClassName("bar"); 
if (list && list.length > 0) { 
    list[0].innerHTML = "Goodbye world!"; 
} 

lub, jeśli chcesz to zrobić z mniej sprawdzania błędów i większej zwięzłości, można to zrobić w jednej linii tak:

document.getElementById("foo").getElementsByClassName("bar")[0].innerHTML = "Goodbye world!"; 

W wyjaśnieniem:

  1. uzyskać element z id="foo".
  2. Następnie można znaleźć obiekty, które są zawarte w tym obiekcie, które mają class="bar".
  3. Zwraca podobną do tablicowej nodeList, więc odwołujesz się do pierwszej pozycji w tej liście węzłowej
  4. Możesz następnie ustawić innerHTML tego elementu, aby zmienić jego zawartość.

Ostrzeżenia: niektóre starsze przeglądarki nie obsługują getElementsByClassName (np. Starsze wersje IE). Funkcję tę można umieścić w miejscu, jeśli jej brakuje.


To gdzie ja zalecamy użycie biblioteki, która ma wbudowaną obsługę selektora CSS3 zamiast martwić się o kompatybilność przeglądarki siebie (niech ktoś inny zrobi całą pracę). Jeśli chcesz, żeby to zrobiła biblioteka, Sizzle będzie działać świetnie. W Sizzle, byłoby to być zrobione tak:

Sizzle("#foo .bar")[0].innerHTML = "Goodbye world!"; 

jQuery ma bibliotekę Sizzle wbudowane i w jQuery, byłoby to:

$("#foo .bar").html("Goodbye world!"); 
+0

Dziękuję, miałem kłopot z document.getElementBy *. jQuery sprawia, że ​​rzeczy są o wiele łatwiejsze. –

4

Jeśli ta musi działać w IE 7 lub obniżyć trzeba pamiętać, że getElementsByClassName nie istnieje we wszystkich przeglądarkach. Z tego powodu możesz stworzyć własny getElementsByClassName lub możesz go wypróbować.

var fooDiv = document.getElementById("foo"); 

for (var i = 0, childNode; i <= fooDiv.childNodes.length; i ++) { 
    childNode = fooDiv.childNodes[i]; 
    if (/bar/.test(childNode.className)) { 
     childNode.innerHTML = "Goodbye world!"; 
    } 
} 
+0

'getElementsByClassName' również nie działa w IE8, ale możesz użyć' querySelectorAll' na swoim miejscu (prawie w każdym razie). – user113716

+0

@ Ӫ _._ Ӫ ... lol ... poprawne, ale po prostu udowadniasz moją odpowiedź jeszcze bardziej. Nie można polegać na getElementsByClassName, jeśli strona musi działać w wielu przeglądarkach. jQuery z pewnością byłby opcją, ale tak powinien być powyższy kod. –

+0

Tak, miałem na myśli ten komentarz na poparcie twojej odpowiedzi, ale także wskazałem, że można użyć 'qSA' w shimie, dzięki czemu nadal możesz używać natywnego kodu w IE8. Chociaż przyjrzymy się bliżej Twojemu rozwiązaniu, masz kilka rzeczy, które wymagają naprawy. – user113716

-3

Nie należy stosować document.getElementById ponieważ jego praca tylko dla klientów kontroli ubocznych, które identyfikatory są stałe. Powinieneś użyć jquery zamiast jak poniżej przykładu.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>                            
<div id="foo"> 
    <div class="bar"> 
      Hello world! 
    </div> 
</div> 

wykorzystanie w ten sposób: "".

$("[id^='foo']").find("[class^='bar']") 

// do not forget to add script tags as above 

jeśli chcesz edytować dowolny usuń wtedy każda operacja wystarczy dodać tyłu i wykonać operacje

+7

Używanie broni termojądrowej do zabicia jelenia zadziała, ale jest lekkim przesadą. Używanie biblioteki jQuery z wieloma kb do wybrania elementu, gdy JavaScript oferuje tę funkcję w jego kodzie podstawowym, jest nieco bardziej przesadny. – Danejir

3

funkcji rekurencyjnej:

function getElementInsideElement(baseElement, wantedElementID) { 
    var elementToReturn; 
    for (var i = 0; i < baseElement.childNodes.length; i++) { 
     elementToReturn = baseElement.childNodes[i]; 
     if (elementToReturn.id == wantedElementID) { 
      return elementToReturn; 
     } else { 
      return getElementInsideElement(elementToReturn, wantedElementID); 
     } 
    } 
} 
0

Najprostszym sposobem na to jest:

function findChild(idOfElement, idOfChild){ 
    let element = document.getElementById(idOfElement); 
    return element.querySelector('[id=' + idOfChild + ']'); 
} 

lub lepiej czytelne:

findChild = (idOfElement, idOfChild) => { 
    let element = document.getElementById(idOfElement); 
    return element.querySelector(`[id=${idOfChild}]`); 
} 
Powiązane problemy