NamedNodeMap#
NamedNodeMap.item()#
Metoda item()
zwraca atrybut o określonym indeksie z listy atrybutów skojarzonej z daną mapą nazwanych atrybutów. Jeśli w liście atrybutów nie ma atrybutu o danym indeksie to zwrócona zostanie wartość null
.
Opis działania#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
var attr = namedNodeMap.item(index); var attr = namedNodeMap[index]; // alternatywa z JS
gdzie poszczególne człony oznaczają:
- attr - referencja do zwracanego atrybutu lub wartość
null
. - namedNodeMap - mapa nazwanych atrybutów będąca obiektem kontekstu.
- index - liczba całkowita reprezentująca pozycję atrybutu w liście atrybutów.
Algorytm wywołania metody item(index)
nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:
- Jeśli index jest równy lub większy od liczby atrybutów w liście atrybutów skojarzonej z obiektem kontekstu, to zwróć wartość
null
. - Zwróć atrybut z pozycją wskazywaną przez index, który znajduje się w liście atrybutów skojarzonej z obiektem kontekstu.
W przypadku alternatywy z JS dla metody item()
mamy do czynienia z pojęciem obsługiwanych indeksów właściwości.
Prosty przykład:
<!DOCTYPE html>
<html>
<head>
<script>
function getItem(method){
var p = document.getElementsByTagName("p")[0]; // referencja do akapitu
p.setAttribute("id", "Identyfikator");
p.className = "Klasa1 Klasa2 Klasa3";
var allAttr = p.attributes;
if (method == 0){
var attr = allAttr.item(method); // atrybut o indeksie 0
}
else if (method == 1){
var attr = allAttr.item(method); // atrybut o indeksie 1
}
else if (method == 2){
var attr = allAttr[method]; // atrybut o indeksie 0
}
else if (method == 3){
var attr = allAttr[method]; // atrybut o indeksie 1
}
else if (method == 10){
var attr = allAttr.item(method); // atrybut o indeksie 10
}
else if (method == 15){
var attr = allAttr[method]; // atrybut o indeksie 15
}
var info = document.getElementById("info");
info.innerHTML = "Interfejs mapy nazwanych atrybutów: " + allAttr // [object NamedNodeMap]
+ "<br>" + "Właściwość length: " + allAttr.length;
if (attr){
info.innerHTML += "<br><br>" + "Interfejs atrybutu: " + attr
+ "<br>" + "Indeks w mapie: " + method
+ "<br>" + "Właściwość name: " + attr.name
+ "<br>" + "Właściwość value: " + attr.value;
}
else{
info.innerHTML += "<br><br>Wartość: " + String(attr)
+ "<br>" + "Indeks w mapie: " + method;
}
}
</script>
</head>
<body>
<p>Akapit z atrybutami ustawianymi z poziomu skryptu:</p>
<ul>
<li>p.setAttribute("id", "Identyfikator");</li>
<li>p.className = "Klasa1 Klasa2 Klasa3";</li>
</ul>
<p>Kliknij przycisk by pobrać atrybut o określonym indeksie z listy atrybutów akapitu.</p>
<input type="button" value="p.attributes.item(0)" onclick="getItem(0)">
<input type="button" value="p.attributes.item(1)" onclick="getItem(1)">
<input type="button" value="p.attributes[0]" onclick="getItem(0)">
<input type="button" value="p.attributes[1]" onclick="getItem(1)">
<input type="button" value="p.attributes.item(10)" onclick="getItem(10)">
<input type="button" value="p.attributes[15]" onclick="getItem(15)">
<p style="color: blue;">Szczegółowe informacje dla pobranych atrybutów:</p>
<p id="info"></p>
</body>
</html>
W powyższym przykładzie widać wyraźnie, że jest drobna różnica między dwoma analogicznymi (w teorii) sposobami. Metoda item()
dla indeksu równego lub większego od wartości atrybutu NamedNodeMap.length
zwraca wartość null
, kiedy nawiasowe odwołanie []
zwraca wartość undefined
. Nie dotyczy przeglądarki IE, która w drugim sposobie błędnie zwraca wartość null
.
Składnia Web IDL#
[LegacyUnenumerableNamedProperties] interface NamedNodeMap { getter Attr? item(unsigned long index); }