Ogólne#
Nodes#
W tym miejscu umieszczam powtarzające się specyficzne pojęcia i algorytmy w dziale NODES, czyli mogą mieć one zastosowanie dla wszystkich interfejsów z tego działu.
Pojęcia#
node document
Każdy węzeł jest skojarzony z właścicielem # (node document), którym jest dokument (np. węzeł typu Document
lub inny dziedziczący po nim), i który jest ustawiany automatycznie w czasie tworzenia tego węzła. Z dowolnego węzła można pobrać jego właściciela za pomocą właściwości Node.ownerDocument
, pamiętając jednocześnie o tym, że dla dokumentów zwracana będzie wartość null
.
Właściciel dla danego węzła może zostać zmieniony już po jego utworzeniu. Odbywa się to wyłącznie za pośrednictwem algorytmu adoptującego wykorzystywanego w niektórych metodach, np. Document.adoptNode()
, Node.appendChild()
, Node.insertBefore()
czy Node.replaceChild()
.
length
Długość # (length) w węźle node zależy od jego typu:
- Dla węzła typu
DocumentType
wynosi zero. - Dla węzła typu
Text
,ProcessingInstruction
iComment
jest równa wartości atrybutulength
. - Dla pozostałych węzłów jest równa liczbie ich dzieci.
empty
Węzeł jest uznawany za pusty # (empty) jeśli jego długość wynosi zero.
Algorytmy#
adopting steps
Obowiązujące specyfikacje mogą definiować dodatkowe kroki adoptowania # (adopting steps) dla wszystkich lub poszczególnych węzłów. Do algorytmu przekazywane są argumenty node i oldDocument, jak w poniższym algorytmie adoptowania.
adopt
Aby adoptować # (adopt) węzeł node do dokumentu document należy wykonać następujące kroki:
- Niech oldDocument będzie właścicielem w node.
- Jeśli rodzic w node nie ma wartości
null
, to usuń node z jego rodzica. Jeśli document nie jest taki sam jak oldDocument, to wykonaj poniższe podkroki:
- Dla każdego (for each) potomka obejmującego descendant z potomków obejmujących w node, zgodnie z porządkiem drzewa, ustaw właściciela w descendant na document.
- Dla każdego (for each) potomka obejmującego descendant z potomków obejmujących w node, zgodnie z porządkiem drzewa, uruchom dodatkowe kroki adoptowania z przekazaniem descendant i oldDocument.
adopt
Obowiązujące specyfikacje mogą definiować dodatkowe kroki klonowania # (cloning steps) dla wszystkich lub poszczególnych węzłów. Do algorytmu przekazywane są argumenty copy, node, document i opcjonalnie clone children flag, jak w poniższym algorytmie klonowania.
Specyfikacja HTML5 określa dodatkowe kroki klonowania dla skryptów oraz pól wejściowych formularza. SVG powinien robić to samo dla swoich elementów skryptowych, ale w tym momencie tego nie czyni.
clone
Aby sklonować # (clone) węzeł node, z opcjonalnym dokumentem document i flagą klonowania dzieci clone children flag, należy wykonać następujące kroki:
- Jeśli document nie został przekazany, to niech document wskazuje na właściciela w node.
Niech copy będzie nowym węzłem implementującym ten sam interfejs jak w node, i w zależności od node, wykonaj poniższe podkroki:
- Dla węzła typu
Document
- Ustaw kodowanie, typ zawartości, adres URL, typ oraz tryb w copy na te same wartości, co w node.
- Dla węzła typu
DocumentType
- Ustaw nazwę, identyfikator publiczny oraz identyfikator systemowy w copy na te same wartości, co w node.
- Dla węzła typu
Element
- Ustaw przestrzeń nazw, prefiks przestrzeni nazw oraz nazwę lokalną w copy na te same wartości, co w node.
Dla każdego (for each) atrybutu attribute w liście atrybutów skojarzonej z node, zgodnie z kolejnością, wykonaj poniższe wewnętrzne podkroki:
- Niech copyAttribute będzie nowym obiektem typu
Attr
. - Ustaw przestrzeń nazw, prefiks przestrzeni nazw, nazwę lokalną oraz wartość w copyAttribute na te same wartości, co w attribute.
- Dodaj copyAttribute do listy atrybutów skojarzonej z copy.
- Niech copyAttribute będzie nowym obiektem typu
- Dla węzła typu
Text
iComment
- Ustaw dane tekstowe w copy na te same wartości, co w node.
- Dla węzła typu
ProcessingInstruction
- Ustaw cel oraz dane tekstowe w copy na te same wartości, co w node.
- Dla pozostałych węzłów
- Niczego nie rób.
- Dla węzła typu
- Jeśli copy jest węzłem typu
Document
, to ustaw właściciela w copy oraz document na copy, w przeciwnym razie ustaw właściciela w copy na document. - Uruchom wszystkie dodatkowe kroki klonowania dla node zdefiniowane w innych obowiązujących specyfikacjach, z przekazaniem copy, node, document i clone children flag (jeśli ustawiona).
- Jeśli clone children flag jest ustawiona, to klonuj wszystkie dzieci w node i dołącz je do copy, z przekazaniem document i clone children flag.
- Zwróć copy.
equals
Węzeł A jest zgodny # (equals) z węzłem B jeśli wszystkie poniższe warunki są prawdziwe:
- Wartość atrybutu
nodeType
w A i B jest taka sama. - Poniższe, w zależności od A, są również zgodne:
- Dla węzła typu
DocumentType
sprawdzaj nazwę, identyfikator publiczny oraz identyfikator systemowy. - Dla węzła typu
Element
sprawdzaj przestrzeń nazw, prefiks przestrzeni nazw, nazwę lokalną oraz liczbę jego atrybutów w skojarzonej liście atrybutów. - Dla węzła typu
ProcessingInstruction
sprawdzaj cel oraz dane tekstowe. - Dla węzła typu
Text
iComment
sprawdzaj dane tekstowe. - Dla pozostałych węzłów niczego nie rób.
- Dla węzła typu
- Jeśli A jest węzłem typu
Element
, to każdy jego atrybut w skojarzonej liście atrybutów ma odpowiadający atrybut w liście atrybutów skojarzonej z B, z tą samą przestrzenią nazw, prefiksem przestrzeni nazw, nazwą lokalną i wartością. - Zarówno A i B mają identyczną liczbę dzieci.
- Każde dziecko w A jest zgodne z dzieckiem w B o tym samym indeksie.
locate a namespace prefix
Aby zlokalizować prefiks przestrzeni nazw # (locate a namespace prefix) dla elementu element przy pomocy przestrzeni nazw namespace należy wykonać następujące kroki:
- Jeśli przestrzenią nazw w element jest namespace i jego prefiks przestrzeni nazw nie ma wartości
null
, to zwróć jego prefiks przestrzeni nazw. - Jeśli element posiada jakiś atrybut, którego prefiks przestrzeni nazw ma wartość "
xmlns
" i jego wartością jest namespace, to zwróć nazwę lokalną pierwszego takiego atrybutu z element. - Jeśli rodzicem elementowym w element nie jest wartość
null
, to zwróć wynik lokalizacji prefiksu przestrzeni nazw dla element z przekazaniem namespace. W przeciwnym razie zwróć wartośćnull
.
locate a namespace
Aby zlokalizować przestrzeń nazw # (locate a namespace ) dla węzła node przy pomocy prefiksu przestrzeni nazw prefix należy, w zależności od node, wykonać następujące kroki:
- Dla węzła typu
Element
- Jeśli jego przestrzenią nazw nie jest wartość
null
i jego prefiksem przestrzeni nazw jest prefix, to zwróć jego przestrzeń nazw. Jeśli posiada on atrybut, którego przestrzenią nazw jest przestrzeń nazw XMLNS, prefiksem przestrzeni nazw jest "
xmlns
" i nazwą lokalną jest prefix, lub jeśli prefix ma wartośćnull
i posiada on atrybut, którego przestrzenią nazw jest przestrzeń nazw XMLNS, prefiksem przestrzeni nazw jest wartośćnull
i nazwą lokalną jest "xmlns
":- Niech value będzie jego wartością jeśli nie jest ona pustym łańcuchem znakowym, w przeciwnym razie niech będzie wartością
null
. - Zwróć value.
- Niech value będzie jego wartością jeśli nie jest ona pustym łańcuchem znakowym, w przeciwnym razie niech będzie wartością
- Jeśli jego rodzicem elementowym jest wartość
null
, to zwróć wartośćnull
. - Zwróć wynik lokalizacji przestrzeni nazw na jego rodzicu elementowym z przekazaniem prefix.
- Jeśli jego przestrzenią nazw nie jest wartość
- Dla węzła typu
Document
- Jeśli jego elementem dokumentowym jest wartość
null
, to zwróć wartośćnull
. - Zwróć wynik lokalizacji przestrzeni nazw na jego elemencie dokumentowym z przekazaniem prefix.
- Jeśli jego elementem dokumentowym jest wartość
- Dla węzła typu
DocumentType
iDocumentFragment
- Zwróć wartość
null
.
- Zwróć wartość
- Dla pozostałych węzłów
- Jeśli jego rodzicem elementowym jest wartość
null
, to zwróć wartośćnull
. - Zwróć wynik lokalizacji przestrzeni nazw na jego rodzicu elementowym z przekazaniem prefix.
- Jeśli jego rodzicem elementowym jest wartość
list of elements with qualified name qualifiedName
Lista elementów z nazwą kwalifikowaną qualifiedName # (list of elements with qualified name qualifiedName) dla węzła root jest kolekcją typu HTMLCollection
zwróconą zgodnie z poniższym algorytmem:
- Jeśli qualifiedName ma wartość "
*
" (U+002A
), to zwróć kolekcję typuHTMLCollection
zakorzenioną w root, której filtr pasuje jedynie do jego potomkowych węzłów typuElement
. W przeciwnym razie, jeśli właścicielem w root jest dokument HTML, to zwróć kolekcję typu
HTMLCollection
zakorzenioną w root, której filtr pasuje jedynie do jego potomkowych węzłów typuElement
spełniających następujące reguły:- Ich przestrzeń nazw jest przestrzenią nazw HTML i nazwa kwalifikowana to qualifiedName uprzednio przekonwertowana na małe znaki ASCII.
- Ich przestrzeń nazw nie jest przestrzenią nazw HTML i nazwa kwalifikowana to qualifiedName.
- W przeciwnym razie zwróć kolekcję typu
HTMLCollection
zakorzenioną w root, której filtr pasuje jedynie do jego potomkowych węzłów typuElement
mających nazwę kwalifikowaną wskazywaną przez qualifiedName.
Po kolejnym wywołaniu metody z tym samym argumentem, i tak długo jak typ we właścicielu skojarzonym z root nie uległ zmianie (tj. z wartości "html
" na "xml
" lub odwrotnie), może zostać zwrócony ten sam obiekt HTMLCollection
, który utworzony i zwrócony został we wcześniejszym wywołaniu metody (szczegóły).
list of elements with namespace namespace and local name localName
Lista elementów z przestrzenią nazw namespace i nazwą lokalną localName # (list of elements with namespace namespace and local name localName) dla węzła root jest kolekcją typu HTMLCollection
zwróconą zgodnie z poniższym algorytmem:
- Jeśli namespace jest pustym łańcuchem znakowym, to ustaw ją na wartość
null
. - Jeśli jednocześnie namespace i localName ma wartość "
*
" (U+002A
), to zwróć kolekcję typuHTMLCollection
zakorzenioną w root, której filtr pasuje jedynie do jego potomkowych węzłów typuElement
. - W przeciwnym razie, jeśli tylko namespace ma wartość "
*
" (U+002A
), to zwróć kolekcję typuHTMLCollection
, której filtr pasuje jedynie do jego potomkowych węzłów typuElement
mających nazwę lokalną wskazywaną przez localName. - W przeciwnym razie, jeśli tylko localName ma wartość "
*
" (U+002A
), to zwróć kolekcję typuHTMLCollection
, której filtr pasuje jedynie do jego potomkowych węzłów typuElement
mających przestrzeń nazw wskazywaną przez namespace. - W przeciwnym razie zwróć kolekcję typu
HTMLCollection
, której filtr pasuje jedynie do jego potomkowych węzłów typuElement
mających przestrzeń nazw wskazywaną przez namespace i nazwę lokalną wskazywaną przez localName.
Po kolejnym wywołaniu metody z tymi samymi argumentami może zostać zwrócony ten sam obiekt HTMLCollection
, który utworzony i zwrócony został we wcześniejszym wywołaniu metody (szczegóły).
list of elements with class names classNames
Lista elementów z nazwami klas classNames # (list of elements with class names classNames) dla węzła root jest kolekcją typu HTMLCollection
zwróconą zgodnie z poniższym algorytmem:
- Niech classes będzie wynikiem parsowania uporządkowanego zestawu na classNames.
- Jeśli classes jest pustym zestawem, to zwróć pustą kolekcję typu
HTMLCollection
. Zwróć kolekcję typu
HTMLCollection
zakorzenioną w root, której filtr pasuje jedynie do jego potomkowych węzłów typuElement
mających wszystkie klasy z classes.Jeśli właścicielem w root jest dokument z trybem "
quirks
", to porównywanie dla klas jest wykonywane pod względem nieczułości na wielkość znaków ASCII, w przeciwnym razie porównywanie jest czułe na wielkość znaków.
Po kolejnym wywołaniu metody z tym samym argumentem może zostać zwrócony ten sam obiekt HTMLCollection
, który utworzony i zwrócony został we wcześniejszym wywołaniu metody (szczegóły).
convert nodes into a node
Aby skonwertować nodes do węzła # (convert nodes into a node) należy wykonać następujące kroki:
- Niech node będzie wartością
null
. - Zastąp każdy łańcuch znakowy w nodes przez węzeł typu
Text
, którego danymi tekstowymi będzie łańcuch znakowy we własnej postaci. - Jeśli nodes zawiera pojedynczy węzeł, to ustaw node na ten pojedynczy węzeł.
- W przeciwnym razie ustaw node na nowy węzeł typu
DocumentFragment
, a następnie dodaj każdy węzeł z nodes, jeśli w ogóle istnieje, do node. Zrzuć ponownie każdy wyjątek. - Zwróć node.
Mutation algorithms
ensure pre-insertion validity
Aby zagwarantować poprawność przed wstawieniem # (ensure pre-insertion validity) węzła node do rodzica parent przed dzieckiem child należy wykonać następujące kroki:
- Jeśli parent nie jest węzłem typu
Document
,DocumentFragment
lubElement
, to zrzuć wyjątek"HierarchyRequestError"
. - Jeśli node jest przodkiem obejmującym włącznie z hostem dla parent, to zrzuć wyjątek
"HierarchyRequestError"
. - Jeśli child nie ma wartości
null
i jego rodzicem nie jest parent, to zrzuć wyjątek"NotFoundError"
. - Jeśli node nie jest węzłem typu
DocumentFragment
,DocumentType
,Element
,Text
,ProcessingInstruction
lubComment
, to zrzuć wyjątek"HierarchyRequestError"
. - Jeśli node jest węzłem typu
Text
i parent jest węzłem typuDocument
, lub node jest węzłem typuDocumentType
i parent nie jest węzłem typuDocument
, to zrzuć wyjątek"HierarchyRequestError"
. Jeśli parent jest węzłem typu
Document
, to wykonaj poniższe podkroki:Jeśli node jest węzłem typu
DocumentFragment
, to wykonaj poniższe wewnętrzne podkroki:- Jeśli node posiada więcej niż jedno dziecko typu
Element
lub posiada dziecko typuText
, to zrzuć wyjątek"HierarchyRequestError"
. - Jeśli node posiada jedno dziecko typu
Element
, i albo parent posiada dziecko typuElement
, child jest węzłem typuDocumentType
, lub child nie ma wartościnull
i węzeł typuDocumentType
w parent następuje po child, to zrzuć wyjątek"HierarchyRequestError"
.
- Jeśli node posiada więcej niż jedno dziecko typu
- Jeśli node jest węzłem typu
Element
, i albo parent posiada dziecko typuElement
, child jest węzłem typuDocumentType
, lub child nie ma wartościnull
i węzeł typuDocumentType
w parent następuje po child, to zrzuć wyjątek"HierarchyRequestError"
. - Jeśli node jest węzłem typu
DocumentType
, i albo parent posiada dziecko typuDocumentType
, child nie ma wartościnull
i węzeł typuElement
w parent poprzedza child, lub child ma wartościnull
i parent ma dziecko typuElement
, to zrzuć wyjątek"HierarchyRequestError"
.
pre-insert
Przed wstawieniem # (pre-insert) węzła node do rodzica parent przed dzieckiem child należy wykonać następujące kroki:
- Zagwarantuj poprawność przed wstawieniem node do parent przed child.
- Niech reference child wskazuje na child.
- Jeśli reference child jest naszym node, to ustaw go na brata następującego w node.
- Adoptuj node do właściciela w parent.
- Wstaw node do parent przed reference child.
- Zwróć node.
insertion steps
Obowiązujące specyfikacje mogą definiować dodatkowe kroki wstawiania # (insertion steps) dla wszystkich lub poszczególnych węzłów. Do algorytmu przekazywany jest argument newNode, jak w poniższym algorytmie wstawiania.
insert
Aby wstawić # (insert) węzeł node do rodzica parent przed dzieckiem child, z opcjonalną flagą tłumienia obserwatorów suppress observers flag, należy wykonać następujące kroki:
- Niech count będzie liczbą dzieci w node jeśli jest nim węzeł typu
DocumentFragment
, w przeciwnym razie niech będzie liczbą jeden. Jeśli child nie ma wartości
null
, to wykonaj poniższe podkroki:- Dla każdego (for each) zakresu, którego węzłem początkowym jest parent i przesunięcie początkowe jest większe od indeksu w child, zwiększ jego przesunięcie początkowe o count.
- Dla każdego (for each) zakresu, którego węzłem końcowym jest parent i przesunięcie końcowe jest większe od indeksu w child, zwiększ jego przesunięcie końcowe o count.
- Niech nodes będą dziećmi w node jeśli node jest węzłem typu
DocumentFragment
, w przeciwnym razie niech będą listą zawierającą wyłącznie node. - Jeśli node jest węzłem typu
DocumentFragment
, to usuń jego dzieci z ustawieniem suppress observers flag. - Jeśli node jest węzłem typu
DocumentFragment
, to kolejkuj zapis zmian z typem "childList
", celem node oraz usuniętymi węzłami wskazywanymi przez nodes.Ten krok celowo nie skupia uwagi na suppress observers flag.
Dla każdego (for each) węzła newNode w nodes, zgodnie z porządkiem drzewa, wykonaj poniższe podkroki:
- Dodaj newNode do parent przed child lub, jeśli child ma wartość
null
, to na końcu parent. - Uruchom dodatkowe kroki wstawiania z przekazaniem newNode.
- Dodaj newNode do parent przed child lub, jeśli child ma wartość
- Jeśli suppress observers flag nie jest ustawiona, to kolejkuj zapis zmian z typem "
childList
", celem parent, dodanymi węzłami wskazywanymi przez nodes, bratem następującym wskazywanym przez child i bratem poprzedzającym będącym bratem poprzedzającym w child lub, jeśli child ma wartośćnull
, to ostatnim dzieckiem w parent.
append
Aby dodać # (append) węzeł node do rodzica parent należy wykonać przed wstawianie node do parent przed null
.
replace
Aby zastąpić # (replace) dziecko child węzłem node w rodzicu parent należy wykonać następujące kroki:
- Jeśli parent nie jest węzłem typu
Document
,DocumentFragment
lubElement
, to zrzuć wyjątek"HierarchyRequestError"
. - Jeśli node jest przodkiem obejmującym włącznie z hostem dla parent, to zrzuć wyjątek
"HierarchyRequestError"
. - Jeśli rodzicem w child nie jest parent, to zrzuć wyjątek
"NotFoundError"
. - Jeśli node nie jest węzłem typu
DocumentFragment
,DocumentType
,Element
,Text
,ProcessingInstruction
lubComment
, to zrzuć wyjątek"HierarchyRequestError"
. - Jeśli node jest węzłem typu
Text
i parent jest węzłem typuDocument
, lub node jest węzłem typuDocumentType
i parent nie jest węzłem typuDocument
, to zrzuć wyjątek"HierarchyRequestError"
. Jeśli parent jest węzłem typu
Document
, to wykonaj poniższe podkroki:Jeśli node jest węzłem typu
DocumentFragment
, to wykonaj poniższe wewnętrzne podkroki:- Jeśli node posiada więcej niż jedno dziecko typu
Element
lub posiada dziecko typuText
, to zrzuć wyjątek"HierarchyRequestError"
. - Jeśli node posiada jedno dziecko typu
Element
, i albo parent posiada dziecko typuElement
, którym nie jest child, albo węzeł typuDocumentType
w parent następuje po child, to zrzuć wyjątek"HierarchyRequestError"
.
- Jeśli node posiada więcej niż jedno dziecko typu
- Jeśli node jest węzłem typu
Element
, i albo parent posiada dziecko typuElement
, którym nie jest child, albo węzeł typuDocumentType
w parent następuje po child, to zrzuć wyjątek"HierarchyRequestError"
. - Jeśli node jest węzłem typu
DocumentType
, i albo parent posiada dziecko typuDocumentType
, którym nie jest child, albo węzeł typuElement
w parent poprzedza child, to zrzuć wyjątek"HierarchyRequestError"
.
- Niech reference child będzie bratem następującym w child.
- Jeśli reference child jest naszym node, to ustaw go na brata następującego w node.
- Niech previousSibling będzie bratem poprzedzającym w node.
- Adoptuj node do właściciela w parent.
- Niech removedNodes będzie pustą listą.
Jeśli rodzic w child nie ma wartość
null
, to wykonaj poniższe wewnętrzne podkroki:- Ustaw removedNodes na listę zawierającą wyłącznie child.
- Usuń child z jego parent z ustawieniem flagi tłumienia obserwatorów.
Powyższe kroki nie zostaną spełnione jedynie w sytuacji, kiedy child jest referencją do node.
- Niech nodes będzie listą ze wszystkimi dziećmi w node jeśli node jest węzłem typu
DocumentFragment
, w przeciwnym razie niech będzie listą zawierającą wyłącznie node. - Wstaw node do parent przed reference child z ustawieniem flagi tłumienia obserwatorów.
- Kolejkuj zapis zmian z typem "
childList
", celem parent, dodanymi węzłami wskazywanymi przez nodes, usuniętymi węzłami wskazywanymi przez removedNodes, bratem następującym wskazywanym przez child oraz bratem poprzedzającym wskazywanym przez previousSibling. - Zwróć child.
replace all
Aby zastąpić wszystko # (replace all) węzłem node w rodzicu parent należy wykonać następujące kroki:
- Jeśli node nie ma wartości
null
, to adoptuj node do właściciela w parent. - Niech removedNodes będzie listą ze wszystkimi dziećmi w parent.
- Niech addedNodes będzie pustą listą jeśli node ma wartość
null
, dziećmi w node jeśli node jest węzłem typuDocumentFragment
, w przeciwnym razie niech będzie listą zawierającą wyłącznie node. - Usuń, zgodnie z porządkiem drzewa, wszystkie dzieci w parent z ustawieniem flagi tłumienia obserwatorów.
- Jeśli node nie ma wartości
null
, to wstaw node do parent przednull
z ustawieniem flagi tłumienia obserwatorów. - Kolejkuj zapis zmian z typem "
childList
", celem parent, dodanymi węzłami wskazywanymi przez addedNodes oraz usuniętymi węzłami wskazywanymi przez removedNodes.
Algorytm ten nie wprowadza żadnych kontroli w odniesieniu do ograniczeń dla drzewa węzłów. Autorzy specyfikacji powinni używać go z rozwagą.
pre-remove
Przed usunięciem # (pre-remove) dziecka child z rodzica parent należy wykonać następujące kroki:
- Jeśli rodzicem w child nie jest parent , to zrzuć wyjątek
"NotFoundError"
. - Usuń child z parent.
- Zwróć child.
removing steps
Obowiązujące specyfikacje mogą definiować dodatkowe kroki usuwania # (removing steps) dla wszystkich lub poszczególnych węzłów. Do algorytmu przekazywane są argumenty removedNode, oldParent i oldPreviousSibling, jak w poniższym algorytmie usuwania.
remove
Aby usunąć # (remove) węzeł node z rodzica parent, z opcjonalną flagą tłumienia obserwatorów suppress observers flag, należy wykonać następujące kroki:
- Niech index będzie indeksem w node.
- Dla każdego (for each) zakresu, którego węzeł początkowy jest potomkiem obejmującym dla node, ustaw jego początek na (parent, index).
- Dla każdego (for each) zakresu, którego węzeł końcowy jest potomkiem obejmującym node, ustaw jego koniec na (parent, index).
- Dla każdego (for each) zakresu, którego węzłem początkowym jest parent i przesunięcie początkowe jest większe od index, zmniejsz jego przesunięcie początkowe o jeden.
- Dla każdego (for each) zakresu, którego węzłem końcowym jest parent i przesunięcie końcowe jest większe od index, zmniejsz jego przesunięcie końcowe o jeden.
- Dla każdego (for each) obiektu typu
NodeIterator
iterator, którego właścicielem w korzeniu skojarzonym z iterator jest właściciel w node, uruchom kroki przed-usuwania z przekazaniem node i iterator. - Niech oldPreviousSibling będzie bratem poprzedzającym w node.
- Niech oldNextSibling będzie bratem następującym w node.
- Usuń node z parent.
- Uruchom dodatkowe kroki usuwania z przekazaniem node, parent i oldPreviousSibling.
- Dla każdego (for each) przodka obejmującego ancestor w node, jeśli ancestor ma jakichkolwiek zarejestrowanych obserwatorów, w których właściwość
subtree
z opcji ma boolowską wartośćtrue
, to dla każdego (for each) takiego zarejestrowanego obserwatora registered dodaj do listy zarejestrowanych obserwatorów skojarzonej z node przejściowego zarejestrowanego obserwatora z obserwatorem i opcjami identycznymi jak w registered, a także ze źródłem będącym registered. - Jeśli suppress observers flag nie jest ustawiona, to kolejkuj zapis zmian z typem "
childList
", celem parent, usuniętymi węzłami wskazywanymi przez listę zawierającą wyłącznie node, bratem następującym wskazywanym przez oldNextSibling oraz bratem poprzedzającym wskazywanym przez oldPreviousSibling.