Document#
Document.createAttributeNS()#
Metoda createAttributeNS()
tworzy nowy atrybut z określoną przestrzenią nazw i nazwą kwalifikowaną dla danego dokumentu.
Opis działania#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
var new_attr = document.createAttributeNS(namespace, qualifiedName);
gdzie poszczególne człony oznaczają:
- new_attr - referencja do nowego atrybutu.
- document - dokument będący obiektem kontekstu.
- namespace - łańcuch znakowy reprezentujący przestrzeń nazw w nowym atrybucie lub wartość
null
. Pusty łańcuch znakowy ma identyczne działanie jak przekazanie wartościnull
. - qualifiedName - łańcuch znakowy reprezentujący nazwę kwalifikowaną w nowym atrybucie.
Algorytm wywołania metody createAttributeNS(namespace, qualifiedName)
nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:
- Niech namespace, prefix oraz localName będą wynikiem przekazania namespace i qualifiedName do weryfikacji i wydobycia. Zrzuć ponownie każdy wyjątek.
- Zwróć nowy obiekt typu
Attr
, którego przestrzenią nazw jest namespace, prefiksem przestrzeni nazw jest prefix i nazwą lokalną jest localName.
Analizując dokładnie wszystkie powiązane z metodą createAttributeNS()
algorytmy można zauważyć, że istnieje wiele kombinacji dla argumentów przekazywanych do metody, które najczęściej powodują zrzucenie wyjątku "NamespaceError"
, co jest konsekwencją niewłaściwego stosowania przestrzeni nazw.
Tuż po utworzeniu atrybutu nie będzie on skojarzony z żadnym elementem, dlatego właściwość Attr.ownerElement
ma wartość null
. Atrybut można przypisać do dowolnego elementu za pomocą dedykowanych metod, takich jak Element.setAttributeNode()
, Element.setAttributeNodeNS()
, NamedNodeMap.setNamedItem()
i NamedNodeMap.setNamedItemNS()
. Z drugiej jednak strony nikt nie powinien w ten sposób pracować z atrybutami, istnieją wygodniejsze polecenia wywoływane bezpośrednio na jakimś elemencie.
Obiekt zwracany przez metodę createAttributeNS()
implementuje interfejs Attr, dlatego ma dostęp do wszystkich poleceń z tego interfejsu (oraz z kolejnych interfejsów w łańcuchu dziedziczenia).
Więcej szczegółów związanych z elementami, ich potencjalnymi atrybutami oraz spoiwem w postaci mapy nazwanych atrybutów umieściłem w zbiorczym dziale "Podstawy - Elementy i atrybuty".
Prosty przykład:
<!DOCTYPE html>
<html>
<head>
<script>
function createAttrNS(namespace, name){
function getInfoAttr(desc, whatDoc, whatAttr){
info.innerHTML += desc
+ "<br>" + "Interfejs dokumentu: " + whatDoc
+ "<br>" + "Interfejs atrybutu: " + whatAttr
+ "<br>" + "Pierwszy argument z metody: " + namespace
+ "<br>" + "Drugi argument z metody: " + name
+ "<br><br>" + "Właściwość namespaceURI: " + whatAttr.namespaceURI
+ "<br>" + "Właściwość prefix: " + whatAttr.prefix
+ "<br>" + "Właściwość localName: " + whatAttr.localName
+ "<br>" + "Właściwość name: " + whatAttr.name
+ "<br>" + "Właściwość value: " + whatAttr.value
+ "<br>" + "Właściwość nodeValue: " + whatAttr.nodeValue
+ "<br>" + "Właściwość textContent: ";
try{
textContentSupport = whatAttr.textContent;
}
catch(e){
textContentSupport += e;
}
info.innerHTML += textContentSupport
+ "<br>" + "Właściwość ownerElement: " + whatAttr.ownerElement
+ "<br>" + "Właściwość specified: " + whatAttr.specified + "<br><br>";
}
var info = document.getElementById("info");
info.innerHTML = "";
var textContentSupport = "IE zrzuca błąd: ";
try{
var newAttr1 = document.createAttributeNS(namespace, name);
getInfoAttr("Parametry dla metody createAttribute() w dokumencie HTML:", document, newAttr1);
var newDocXML = document.implementation.createDocument(null, null, null); // nowy dokument XML
var newAttr2 = newDocXML.createAttributeNS(namespace, name);
getInfoAttr("Parametry dla metody createAttribute() w dokumencie XML:", newDocXML, newAttr2);
}
catch(e){
info.innerHTML = "Przekazanie do metody createAttribute() argumentu niezgodnego z wymogami XML zrzuca błąd:"
+ "<br>" + e // opis zależny od przeglądarki
+ "<br>" + e.constructor; // function DOMException() { [native code] }
}
}
</script>
</head>
<body>
<p>Kliknij konkretny przycisk by utworzyć nowy atrybut o określonej przestrzeni nazw i nazwie.</p>
<input type="button" value="createAttributeNS('ns1','Test1')" onclick="createAttrNS('ns1','Test1')">
<input type="button" value="createAttributeNS('','Test1')" onclick="createAttrNS('','Test1')">
<input type="button" value="createAttributeNS(null,'test1')" onclick="createAttrNS(null,'test1')">
<input type="button" value="createAttributeNS('','test1')" onclick="createAttrNS('','test1')">
<input type="button" value="createAttributeNS('ns2','A:TEST2')" onclick="createAttrNS('ns2','A:TEST2')">
<input type="button" value="createAttributeNS('ns2','a:test2')" onclick="createAttrNS('ns2','a:test2')">
<input type="button" value="createAttributeNS('','0')" onclick="createAttrNS('','0')">
<input type="button" value="createAttributeNS('','a:test3')" onclick="createAttrNS('','a:test3')">
<p style="color: blue;">Szczegółowe informacje o nowym atrybucie:</p>
<p id="info"></p>
</body>
</html>
Na chwilę obecną jedynie przeglądarki Firefox i Chrome obsługują metodę createAttributeNS()
zgodnie z najnowszymi wymaganiami specyfikacji DOM4. IE nie udostępnia właściwości Attr.textContent
w atrybutach tworzonych za pomocą metody createAttributeNS()
, chociaż w przypadku innych poleceń nie ma takich problemów.
Składnia Web IDL#
interface Document : Node { [NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName); };