Ogólne#
Element#
W tym miejscu umieszczam powtarzające się specyficzne pojęcia i algorytmy w interfejsie Element.
Pojęcia#
namespace
namespace prefix
local name
Elementy są skojarzone z przestrzenią nazw # (namespace), prefiksem przestrzeni nazw # (namespace prefix) oraz nazwą lokalną # (local name). Przy tworzeniu elementu jego nazwa lokalna musi zostać podana. O ile wyraźnie nie ustalono przy tworzeniu elementu, to jego przestrzeń nazw oraz prefiks przestrzeni nazw mają wartość null
.
qualified name
Nazwą kwalifikowaną # (qualified name) dla danego elementu jest jego nazwa lokalna jeśli jego prefiks przestrzeni nazw ma wartość null
, w przeciwnym razie jest nią jego prefiks przestrzeni nazw, po którym następuje znak ":
" (U+003A
), po którym następuje jego nazwa lokalna.
W ramach pewnej optymalizacji aplikacje klienckie mogą implementować nazwę kwalifikowaną jako wewnętrzny stan elementu, ale nie jest to obowiązkowe. Specyfikacja DOM4 wprowadza dodatkowe pojęcie wyłącznie w celu poprawy czytelności.
Analogia między definicjami XML a wewnętrznymi stanami elementu używanymi przez specyfikację DOM:
- Nazwa przestrzeni nazw (XML) - Przestrzeń nazw (DOM)
- Prefiks przestrzeni nazw (XML) - Prefiks przestrzeni nazw (DOM)
- Nazwa kwalifikowana (XML) - Nazwa kwalifikowana (DOM)
- Część lokalna (XML) - Nazwa lokalna (DOM)
attribute list
Elementy są również skojarzone z uporządkowaną listą atrybutów # (attribute list) eksponowaną poprzez obiekt typu NamedNodeMap
. O ile wyraźnie nie ustalono przy tworzeniu elementu, to jego lista atrybutów jest pusta.
has
Dany element ma # (has) atrybut A jeśli A znajduje się w jego liście atrybutów.
unique identifier
Element może być skojarzony z unikatowym identyfikatorem ID # (unique identifier).
W przeszłości elementy mogły mieć wiele identyfikatorów, przykładowo wyrażanych za pomocą HTML-owego atrybutu id=""
oraz DTD umieszczonych w strukturze znacznikowej. Specyfikacja DOM4 definiuje ID jako koncepcję DOM (ID a concept of the DOM) i pozwala tylko na jedną taką konstrukcję w elemencie udostępnianą przy użyciu atrybutu id
(szczegóły).
classes
Element jest skojarzony z obiektem typu DOMTokenList
. Sam obiekt DOMTokenList
jest skojarzony z nazwą lokalną jakiegoś atrybutu w postaci "class
" i jego uporządkowany zestaw słów stanowi klasy # (classes) dla skojarzonego elementu.
Zarówno w czasie tworzenia elementu, który ma dany atrybut id
z wartością nie będącą pustym łańcuchem znakowym, jak również kiedy atrybut id
w elemencie jest ustawiany na wartość inną niż pusty łańcuch znakowy, to należy ustawić unikatowy identyfikator ID w elemencie na tę nową wartość.
Kiedy atrybut id
w elemencie jest usuwany lub jest ustawiany na pusty łańcuch znakowy, to należy usunąć unikatowy identyfikator ID tego elementu.
Zarówno w czasie tworzenia elementu, który ma dany atrybut class
lub kiedy atrybut class
w elemencie jest ustawiany, to należy ustawić klasy tego elementu na tę nową wartość (sparsowaną).
Kiedy atrybut class
w elemencie jest usuwany, to należy ustawić klasy tego elementu na pusty zestaw.
Choć specyfikacja DOM4 definiuje przetworzeniowe wymagania dla agenta użytkownika w przypadku atrybutów id
i class
dowolnego elementu, to nie stawia żądań, co do prawidłowego ich stosowania.
parent element
Rodzicem elementowym # (parent element) dla danego węzła jest obiekt, który jest rodzicem typu Element
. Jeśli dany węzeł posiada rodzica innego typu lub nie posiada go wcale, to wartością rodzica elementowego będzie null
. Z dowolnego węzła można się odwołać do jego rodzica elementowego za pomocą właściwości Node.parentElement
.
document element
Elementem dokumentowym # (document element) dla danego dokumentu jest obiekt typu Element
, jeśli istnieje, którego rodzicem jest dany dokument, w przeciwnym razie wartością elementu dokumentowego będzie null
. Zgodnie z wymogami dopuszczalnej zawartości dla węzła typu Document
, może istnieć tylko jeden element dokumentowy, do którego można się odwołać za pomocą właściwości Document.documentElement
.
root element
Specyfikacja HTML5 wprowadza ogólniejszą definicję elementowego korzenia (root element), która ma zastosowanie dla dowolnego drzewa węzłów. Każdy element dokumentowy będzie jednocześnie elementowym korzeniem, chociaż specyfikacja HTML5 dla tego osobliwego przypadku używa dłuższego zwrotu elementowy korzeń z obiektu Document
.
in a document
Kiedy element lub jeden z jego przodków jest elementem dokumentowym, to znajduje się w dokumencie # (in a document). W moim kursie taki stan rzeczy nazywam po prostu drzewem dokumentu.
element interface
Interfejsem elementu # (element interface) dla dowolnej nazwy name oraz dowolnej przestrzeni nazw namespace jest interfejs Element, o ile nie zaznaczono inaczej. Przykładowo, standard HTML5 definiuje i używa dla nazwy "html
" oraz przestrzeni nazw HTML interfejsu HTMLHtmlElement.
Algorytmy#
attribute is set
attribute is changed
attribute is added
attribute is removed
Obowiązujące specyfikacje włącznie ze specyfikacją DOM4 mogą używać lub używają haków w postaci atrybut jest ustawiany # (attribute is set), atrybut jest zmieniany # (attribute is changed), atrybut jest dodawany # (attribute is added) i atrybut jest usuwany # (attribute is removed), które służą do dalszego przetwarzania wartości w atrybucie.
change
Aby zmienić # (change) atrybut attribute z elementu element na wartość value należy wykonać następujące kroki:
- Kolejkuj zapis zmian z typem "
attributes
", celem element, nazwą będącą nazwą lokalną w attribute, przestrzenią nazw będącą przestrzenią nazw w attribute oraz poprzednią wartością będącą wartością w attribute. - Ustaw wartość w attribute na value.
- Wykonaj atrybut jest ustawiany i atrybut jest zmieniany.
append
Aby dodać # (append) atrybut attribute do elementu element należy wykonać następujące kroki:
- Kolejkuj zapis zmian z typem "
attributes
", celem element, nazwą będącą nazwą lokalną w attribute, przestrzenią nazw będącą przestrzenią nazw w attribute oraz poprzednią wartością będącą wartościąnull
. - Dodaj attribute do listy atrybutów skojarzonej z element.
- Ustaw element w attribute na element.
- Wykonaj atrybut jest ustawiany i atrybut jest dodawany.
remove
Aby usunąć # (remove) atrybut attribute z elementu element należy wykonać następujące kroki:
- Kolejkuj zapis zmian z typem "
attributes
", celem element, nazwą będącą nazwą lokalną w attribute, przestrzenią nazw będącą przestrzenią nazw w attribute oraz poprzednią wartością będącą wartością w attribute. - Usuń attribute z listy atrybutów skojarzonej z element.
- Ustaw element w attribute na wartość
null
. - Wykonaj atrybut jest usuwany.
replace
Aby zastąpić # (replace) stary atrybut oldAttr nowym atrybutem newAttr w elemencie element należy wykonać następujące kroki:
- Kolejkuj zapis zmian z typem "
attributes
", celem element, nazwą będącą nazwą lokalną w attribute, przestrzenią nazw będącą przestrzenią nazw w attribute oraz poprzednią wartością będącą wartością w attribute. - Zastąp oldAttr przez newAttr w liście atrybutów skojarzonej z element.
- Ustaw element w oldAttr na wartość
null
. - Ustaw element w newAttr na element.
- Wykonaj atrybut jest ustawiany i atrybut jest zmieniany.
get an attribute by name
Aby pobrać atrybut poprzez nazwę # (get an attribute by name) z przekazaniem nazwy kwalifikowanej qualifiedName i elementu element należy wykonać następujące kroki:
- Jeśli element znajduje się w przestrzeni nazw HTML oraz jego właścicielem jest dokument HTML, to niech qualifiedName zostanie przekonwertowana na małe znaki ASCII.
- Zwróć pierwszy atrybut z listy atrybutów skojarzonej z element, którego nazwą kwalifikowaną jest qualifiedName, jeśli takowy istnieje, w przeciwnym razie zwróć wartość
null
.
get an attribute by namespace and local name
Aby pobrać atrybut poprzez przestrzeń nazw i nazwę lokalną # (get an attribute by namespace and local name) z przekazaniem przestrzeni nazw namespace, nazwy lokalnej localName i elementu element należy wykonać następujące kroki:
- Jeśli namespace jest pustym łańcuchem znakowym, to ustaw ją na wartość
null
. - Zwróć atrybut z listy atrybutów skojarzonej z element, którego przestrzenią nazw jest namespace i którego nazwą lokalną jest localName, jeśli takowy istnieje, w przeciwnym razie zwróć wartość
null
.
get an attribute value
Aby pobrać wartość atrybutu # (get an attribute value) z przekazaniem elementu element, nazwy lokalnej localName i opcjonalnej przestrzeni nazw namespace należy wykonać następujące kroki:
- Jeśli namespace nie została przekazana, to ustaw ją na wartość
null
. - Niech attr będzie wynikiem pobrania atrybutu poprzez przestrzeń nazw i nazwę lokalną z przekazaniem namespace, localName i element.
- Jeśli attr jest wartością
null
, to zwróć pusty łańcuch znakowy. - Zwróć wartość z attr.
set an attribute
Aby ustawić atrybut # (set an attribute) z przekazaniem atrybutu attr oraz elementu element należy wykonać następujące kroki:
- Jeśli element w attr nie jest wartością
null
ani przekazanym element, to zrzuć wyjątek"InUseAttributeError"
. - Niech oldAttr będzie wynikiem pobrania atrybutu poprzez przestrzeń nazw i nazwę lokalną z przekazaniem przestrzeni nazw w attr, nazwy lokalnej w attr i element.
- Jeśli oldAttr jest równe attr, to zwróć attr.
- Jeśli oldAttr nie jest wartością
null
, to zastąp oldAttr przez attr w element. - W przeciwnym razie dodaj attr do element.
- Zwróć oldAttr.
set an attribute value
Aby ustawić wartość atrybut # (set an attribute value) dla elementu element z przekazaniem nazwy lokalnej localName i wartości value, z opcjonalnym prefiksem przestrzeni nazw prefix oraz przestrzenią nazw namespace, należy wykonać następujące kroki:
- Jeśli prefix nie został przekazany, to ustaw go na wartość
null
. - Jeśli namespace nie została przekazana, to ustaw ją na wartość
null
. - Niech attribute będzie wynikiem pobrania atrybutu poprzez przestrzeń nazw i nazwę lokalną z przekazaniem namespace, localName i element.
- Jeśli attribute ma wartość
null
, to utwórz atrybut z przestrzenią nazw namespace, prefiksem przestrzeni nazw prefix, nazwą lokalną localName oraz wartością value, a następnie dodaj ten atrybut do element i pomiń kolejne kroki. - Zmień attribute z element na value.
remove an attribute by name
Aby usunąć atrybut poprzez nazwę # (remove an attribute by name) z przekazaniem nazwy kwalifikowanej qualifiedName i elementu element należy wykonać następujące kroki:
- Niech attr będzie wynikiem pobrania atrybutu poprzez nazwę z przekazaniem qualifiedName i element.
- Jeśli attr nie jest wartością
null
, to usuń go z element. - Zwróć attr.
remove an attribute by namespace and local name
Aby usunąć atrybut poprzez przestrzeń nazw i nazwę lokalną # (remove an attribute by namespace and local name) z przekazaniem przestrzeni nazw namespace, nazwy lokalnej localName i elementu element należy wykonać następujące kroki:
- Niech attr będzie wynikiem pobrania atrybutu poprzez przestrzeń nazw i nazwę lokalną z przekazaniem namespace, localName i element.
- Jeśli attr nie jest wartością
null
, to usuń go z element. - Zwróć attr.
match a selectors string
Aby dopasować łańcuch znakowy selektorów # (match a selectors string) selectors na zestawie set należy wykonać następujące kroki:
- Niech s będzie wynikiem parsowania selektora selectors z użyciem zestawu elementów referencyjnych set.
- Jeśli s jest błędem to zrzuć wyjątek
"SyntaxError"
. - Zwróć wynik dopasowania selektora s z użyciem zestawu elementów referencyjnych set.
reflect
Niektóre właściwości (atrybuty IDL) są definiowane w celu odzwierciedlenia # (reflect) zawartości atrybutu z przekazaniem nazwy lokalnej name. Oznacza to, że przy pobieraniu (getting) oraz ustawianiu (setting) należy wykonać następujące czynności:
Odczytanie wartości atrybutu:
- Zwróć wynik pobrania wartości atrybutu z przekazaniem obiektu kontekstu i name.
Zmiana wartości atrybutu:
- Ustaw wartość atrybutu dla obiektu kontekstu z użyciem name i przekazanej wartości.
Więcej szczegółów związanych z techniką odzwierciedlania zawartości atrybutu umieściłem w dziale "Podstawy - Elementy i atrybuty".
insert adjacent
Aby wstawić sąsiada # (insert adjacent) z przekazaniem elementu element, łańcucha znakowego where i węzła node należy, w zależności od pierwszego dopasowania pod względem nieczułości na wielkość znaków ASCII do where, wykonać następujące kroki:
- "
beforebegin
" - Jeśli rodzicem w element jest wartość
null
, to zwróć wartośćnull
. - Zwróć wynik przed wstawienia node do rodzica w element przed element. Zrzuć ponownie każdy wyjątek.
- Jeśli rodzicem w element jest wartość
- "
afterbegin
" - Zwróć wynik przed wstawienia node do element przed pierwszym dzieckiem w element. Zrzuć ponownie każdy wyjątek.
- "
beforeend
" - Zwróć wynik przed wstawienia node do element przed
null
. Zrzuć ponownie każdy wyjątek.
- Zwróć wynik przed wstawienia node do element przed
- "
afterend
" - Jeśli rodzicem w element jest wartość
null
, to zwróć wartośćnull
. - Zwróć wynik przed wstawienia node do rodzica w element przed bratem następującym w element. Zrzuć ponownie każdy wyjątek.
- Jeśli rodzicem w element jest wartość
- W przeciwnym razie
Zrzuć wyjątek
"SyntaxError"
.