ChildNode#
Wstęp#
Interfejs ChildNode (podobnie jak ParentNode) jest abstrakcyjnym interfejsem, nie istnieje żaden obiekt typu ChildNode
ani obiekt samego interfejsu w przestrzeni globalnej, dlatego w definicji Web IDL pojawia się specjalny atrybut rozszerzający [NoInterfaceObject]
. Interfejs ten jest potocznie nazywany dzieckiem węzłowym #.
Dziecko węzłowe skupia w swojej definicji kilka podstawowych metod i właściwości, które mogą być implementowane w innych interfejsach. Na dzień dzisiejszy będą to interfejsy:
Zgromadzenie wielu poleceń w jednym miejscu powoduje, że nie ma potrzeby dublowania tych samych opisów w innych miejscach specyfikacji. Warto zauważyć, że wszystkie polecenia dziecka węzłowego spełniają relację rodzic -> [dziecko] + sąsiad, czyli odnoszą się jedynie do dzieci (z ewentualnym uwzględnieniem sąsiadów) w swoim rodzicu.
Właściwości ChildNode#
Nazwa | Opis |
---|---|
ChildNode.nextElementSibling | Zwraca pierwszego następnika bratowego (będącego elementem) dla danego węzła. |
ChildNode.previousElementSibling | Zwraca pierwszego poprzednika bratowego (będącego elementem) dla danego węzła. |
Metody ChildNode#
Nazwa | Opis |
---|---|
ChildNode.after() | Dodaje przekazane węzły i/lub łańcuchy znakowe za danym węzłem w jego rodzicu. |
ChildNode.before() | Dodaje przekazane węzły i/lub łańcuchy znakowe przed danym węzłem w jego rodzicu. |
ChildNode.remove() | Usuwa dany węzeł z jego rodzica. |
ChildNode.replaceWith() | Zastępuje przekazanymi węzłami i/lub łańcuchami znakowymi dany węzeł w jego rodzicu. |
Szczegóły#
17 października 2013 roku w specyfikacji DOM4 utworzono dodatkowy interfejs NonDocumentTypeChildNode, do którego przeniesiono właściwości ChildNode.nextElementSibling
i ChildNode.previousElementSibling
. Zmiana została podyktowana koniecznością zachowania kompatybilności wstecznej, gdyż działanie niektórych bibliotek (głównie starszych wersji Dojo) opiera się na założeniu, że węzły typu DocumentType
nie posiadają wspomnianych właściwości, i próba ich udostępnienia powoduje zepsucie już utworzonego kodu (DOM - Bug 23691, Mozilla - Bug 932501, Mozilla - Bug 901632, Chromium - Bug 246609). W razie potrzeby można skorzystać z ogólnych właściwości Node.nextSibling
i Node.previousSibling
.
Jest duże prawdopodobieństwo, że w przyszłości wszystko wróci do pierwotnej postaci (bez dodatkowego interfejsu). Na dzień dzisiejszy nie tworzę osobnej strony opisującej kolejny interfejs, informuję jedynie, że taka zmiana miała miejsce. Jeśli sytuacja utrzyma się przez dłuższy czas i nie będzie żadnej szansy przywrócenia poprzedniego stanu, to dokonam stosownych korekt w kursie. Wszystkie aktualne przeglądarki internetowe działają zgodnie z bieżącymi wymaganiami specyfikacji DOM4.
Prosty przykład:
<!DOCTYPE html>
<html>
<body>
<script>
document.write(document.doctype); // [object DocumentType]
document.write("<br><br>");
document.write(document.doctype.previousElementSibling); // undefined
document.write("<br>");
document.write(document.doctype.nextElementSibling); // undefined
document.write("<br><br>");
document.write(document.doctype.previousSibling); // null
document.write("<br>");
document.write(document.doctype.nextSibling); // [object HTMLHtmlElement]
</script>
</body>
</html>
Składnia Web IDL#
[NoInterfaceObject] interface ChildNode # { readonly attribute Element? previousElementSibling; readonly attribute Element? nextElementSibling; [Unscopable] void before((Node or DOMString)... nodes); [Unscopable] void after((Node or DOMString)... nodes); [Unscopable] void replaceWith((Node or DOMString)... nodes); [Unscopable] void remove(); }; DocumentType implements ChildNode; Element implements ChildNode; CharacterData implements ChildNode;