Document#

Document.createAttribute()#

Metoda createAttribute() tworzy nowy atrybut z określoną nazwą lokalną dla danego dokumentu.

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 new_attr = document.createAttribute(localName);

gdzie poszczególne człony oznaczają:

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

  1. Jeśli localName nie pasuje do wzorca Name z XML, to zrzuć wyjątek "InvalidCharacterError".
  2. Jeśli obiekt kontekstu jest dokumentem HTML, to niech localName zostanie przekonwertowana na małe znaki ASCII.
  3. Zwróć nowy obiekt typu Attr, którego nazwą lokalną jest localName.

Zamiana wielkości znaków w argumencie przekazanym do metody createAttribute() dla dokumentów HTML została wprowadzona dopiero w specyfikacji DOM4. Jest ona wynikiem szeregu zabiegów mających na celu wypracowanie wspólnego stanowiska dla wszystkich poleceń atrybutowych, których zachowanie w poszczególnych przeglądarkach internetowych było wyjątkowo niespójne (DOM - Bug 41, Mozilla - Bug 1205364, Mozilla - Bug 1165851).

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ę createAttribute() 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:

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

<head>

	<script>

		function createAttr(localName){

			function getInfoAttr(desc, whatDoc, whatAttr){

				info.innerHTML += desc
					+ "<br>" + "Interfejs dokumentu: " + whatDoc
					+ "<br>" + "Interfejs atrybutu: " + whatAttr
					+ "<br>" + "Argument z metody: " + localName
					+ "<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.createAttribute(localName);
				getInfoAttr("Parametry dla metody createAttribute() w dokumencie HTML:", document, newAttr1);

				var newDocXML = document.implementation.createDocument(null, null, null); // nowy dokument XML
				var newAttr2 = newDocXML.createAttribute(localName);
				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 nazwie lokalnej.</p>
	<input type="button" value="createAttribute('Test1')" onclick="createAttr('Test1')">
	<input type="button" value="createAttribute('test1')" onclick="createAttr('test1')">
	<input type="button" value="createAttribute('A:TEST2')" onclick="createAttr('A:TEST2')">
	<input type="button" value="createAttribute('a:test2')" onclick="createAttr('a:test2')">
	<input type="button" value="createAttribute('0')" onclick="createAttr('0')">

	<p style="color: blue;">Szczegółowe informacje o nowym atrybucie:</p>
	<p id="info"></p>
</body>

</html>

Na chwilę obecną jedynie przeglądarka Firefox obsługuje metodę createAttribute() zgodnie z najnowszymi wymaganiami specyfikacji DOM4. IE nie udostępnia właściwości Attr.textContent w atrybutach tworzonych za pomocą metody createAttribute(), chociaż w przypadku innych poleceń nie ma takich problemów. Chrome traktuje przekazany argument jak nazwę kwalifikowaną w atrybucie, dlatego w pewnych sytuacjach zmienia jego prefiks przestrzeni nazw z domyślnej wartości null (jak w powyższym przykładzie).

Składnia Web IDL#

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
interface Document : Node {
	[NewObject] Element createElement(DOMString localName);
};

Specyfikacje i inne materiały#

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

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