Element#

Element.getElementsByTagName()#

Metoda getElementsByTagName() zwraca kolekcję typu HTMLCollection ze wszystkimi potomkami typu Element o określonej nazwie kwalifikowanej, którzy znajdują się w danym elemencie (zgodnie z porządkiem drzewa). W przypadku braku pasujących elementów zwrócona zostanie pusta kolekcja.

Opis działania#

Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
var elements = element.getElementsByTagName(qualifiedName);

gdzie poszczególne człony oznaczają:

Algorytm wywołania metody getElementsByTagName(qualifiedName) nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:

  1. Zwróć listę elementów z nazwą kwalifikowaną qualifiedName dla obiektu kontekstu.

Wielkość znaków w nazwie kwalifikowanej przeszukiwanych elementów oraz w argumencie przekazanym do metody ma znaczenie w przypadku dokumentów XML, natomiast dla dokumentów HTML jest najczęściej nieistotna, chociaż może mieć znaczenie w pewnych specyficznych okolicznościach. Przykładowo polecenie element.getElementsByTagName("FOO") wywołane na elemencie z właścicielem będącym dokumentem HTML pasuje do elementów <FOO> w przestrzeni nazw innej niż przestrzeń nazw HTML, do elementów <foo> w przestrzeni nazw HTML, ale nie do elementów <FOO> w przestrzeni nazw HTML.

We wszystkich wcześniejszych specyfikacjach DOM metoda getElementsByTagName() zawsze operowała na nazwie kwalifikowanej w elementach. Było to respektowane przez przeglądarki Firefox i IE (do wersji 11), ale nie przez Operę, tych opartych na Webkicie (np. Chrome czy Safari), a nawet późniejszym Edge. W pewnym momencie (tj. 6 września 2010 roku) zmieniono zachowanie metody w nowym DOM4 tak, żeby traktowała przekazany argument jak nazwę lokalną. W Firefoksie dopiero w 2016 roku próbowano nanieść odpowiednie korekty (Mozilla - Bug 492933), ale szybko okazało się, że jest to niekompatybilne z istniejącymi treściami (głównie ze stroną konfiguracyjną drukarek HP) i zmiany cofnięto. Również w bieżącej wersji specyfikacji DOM powrócono do pierwotnych założeń z poprzednich specyfikacjach DOM (DOM - Bug 143).

Prosty przykład:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
<!DOCTYPE html>
<html>

<head>

	<script>

		function getCollectionTagName(whatTagName){

			var newP = document.createElement("p"); // nie został dołączony do kontenera DIV dlatego zostanie pominięty
			newP.textContent = "Nowy akapit poza drzewem elementu DIV.";
			var newUL = document.createElement("ul"); // nie został dołączony do kontenera DIV dlatego zostanie pominięty
			newUL.textContent = "Nowa lista UL poza drzewem elementu DIV.";

			var contener = document.getElementById("contener"); // referencja do kontenera DIV

			if (contener.firstChild.prefix == null){
				var newP2 = document.createElementNS("ns", "test:p");
				newP2.textContent = "Nowy akapit 'test:p' bez przestrzeni nazw utworzony i dodany z poziomu skryptu.";
				contener.insertBefore(newP2, contener.firstChild);
				var newP3 = document.createElementNS("http://www.w3.org/1999/xhtml", "test:p");
				newP3.textContent = "Nowy akapit 'test:p' z przestrzenią nazw HTML utworzony i dodany z poziomu skryptu.";
				contener.insertBefore(newP3, contener.firstChild);
			}

			var allElement = contener.getElementsByTagName(whatTagName); // pobranie kolekcji ze wszystkimi elementami
			var allElementLen = allElement.length;

			var info = document.getElementById("info");

			var result = "Interfejs kolekcji: " + allElement // [object HTMLCollection], Opera i Chrome [object NodeList]
				+ "<br>" + "Liczba węzłów: " + allElement.length;

			for(var i = 0; i < allElementLen; i++){

				var el = allElement[i];

				result += "<br><br>" + "Pobrany akapit: " + el.textContent
					+ "<br>" + "Właściwość prefix: " + el.prefix
					+ "<br>" + "Właściwość localName: " + el.localName
					+ "<br>" + "Właściwość nodeName: " + el.nodeName
					+ "<br>" + "Właściwość tagName: " + el.tagName
					+ "<br>" + "Właściwość namespaceURI: " + el.namespaceURI;

			}

			info.innerHTML = result;

		}

	</script>

</head>

<body>
	<div id="contener">
		<p>Pierwszy akapit.</p>
		<P>Drugi akapit.</p>
		<P>Trzeci akapit.</P>

		<p>Kliknij przycisk <input type="button" value="getElementsByTagName('p')" onclick="getCollectionTagName('p')"> by pobrać wszystkie akapity p w dokumencie (Czwarty akapit).</p>
		<p>Kliknij przycisk <input type="button" value="getElementsByTagName('P')" onclick="getCollectionTagName('P')"> by pobrać wszystkie akapity P w dokumencie (Piąty akapit).</p>
		<p>Kliknij przycisk <input type="button" value="getElementsByTagName('test:p')" onclick="getCollectionTagName('test:p')"> by pobrać wszystkie akapity test:p w dokumencie (Szósty akapit).</p>
		<p>Kliknij przycisk <input type="button" value="getElementsByTagName('TEST:P')" onclick="getCollectionTagName('TEST:P')"> by pobrać wszystkie akapity TEST:P w dokumencie (Siódmy akapit).</p>
		<p>Kliknij przycisk <input type="button" value="getElementsByTagName('ul')" onclick="getCollectionTagName('ul')"> by pobrać wszystkie listy ul w kontenerze DIV (Ósmy akapit).</p>

		<p style="color: blue;">Szczegółowe informacje dla pobranej kolekcji (Dziewiąty akapit):</p>
		<span id="info"></span>
	</div>
</body>

</html>

Metoda getElementsByTagName() została zdefiniowana także w interfejsie Document, dlatego może być bezproblemowo wywoływana na węzłach typu Document.

Składnia Web IDL#

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
interface Element : Node {
	HTMLCollection getElementsByTagName(DOMString qualifiedName);
}

Specyfikacje i inne materiały#

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Element (H1) Element.getElementsByTagName() (H2) Opis działania (H3) Składnia Web IDL (H3) Specyfikacje i inne materiały (H3)