Interfejsy API HTML

W wstępie do tej serii czytamy: „Elementy HTML to węzły, które tworzą model obiektowy dokumentu”. Omówiliśmy już typy węzłów elementów. W tej sekcji omawiamy interfejsy API elementów, które umożliwiają wysyłanie zapytań do tych węzłów.

DOM i AOM

DOM to interfejs API do uzyskiwania dostępu do dokumentów i modyfikowania ich. DOM to drzewo wszystkich węzłów w dokumencie. Niektóre węzły mogą mieć podrzędne, inne nie. Drzewo zawiera elementy wraz z ich atrybutami i węzłami tekstowymi.

Drzewo węzła MLW z elementami i węzłami tekstowymi

Narzędzia przeglądarki nie udostępniają wizualizacji drzewa, takiej jak ta powyżej, ale możesz zobaczyć węzły w inspektorze elementów.

DOM/ARIA.

Reprezentacja drzewa, którą można sprawdzić w narzędziach dla programistów w przeglądarce, to drzewo ułatwień dostępu. AOM jest oparty na DOM. Podobnie drzewo ułatwień dostępności zawiera obiekty reprezentujące wszystkie elementy znaczników, atrybuty i węzły tekstowe:

Przykład AOM

Interfejsy API elementów HTML

Środkowa litera w słowie DOM to „b”. Podobnie jak w przypadku obiektów person lub car w przypadku większości zajęć wprowadzających do programowania obiektowego każdy węzeł w drzewie dokumentu jest obiektem, którym można manipulować za pomocą JavaScriptu.

Przeglądarka udostępnia wiele interfejsów API, które umożliwiają natywne obsługę metod, zdarzeń i zapytań do usług oraz ich aktualizowanie. Węzły elementów zawierają informacje o wszystkich atrybutach ustawionych dla danego elementu. Za pomocą interfejsów HTML możesz uzyskać dostęp do informacji o atrybutach elementu. Możemy na przykład użyć atrybutu HTMLImageElement.alt, aby uzyskać atrybuty alt wszystkich obrazów:

let allImages = document.querySelectorAll('img');
allImages.forEach((imageInstance) => {
  console.log(imageInstance.alt);
});

Interfejsy HTML zapewniają nie tylko dostęp do atrybutów elementu, ale też do wielu innych informacji. Aby uzyskać wysokość każdej sekcji na stronie w stosunku do układu, możemy znaleźć element tylko do odczytu HTMLElement.offsetHeight.

let allSections = document.querySelectorAll('section');
allSections.forEach((sectionInstance) => {
  console.log(sectionInstance.offsetHeight);
});

Jeśli użytkownik zmieni orientację urządzenia lub w inny sposób zmieni szerokość widocznego obszaru, wysokość każdego elementu <section> ulegnie zmianie, a właściwości DOM zostaną automatycznie zaktualizowane.

Interfejsy API interfejsu HTML nie są ograniczone do uzyskiwania dostępu do wartości atrybutów. DOM dostarcza informacji o bieżącym stanie interfejsu użytkownika. Interfejsy HTML API mają dostęp do wszystkich tych informacji. Możesz sprawdzić długość filmu, miejsce, w którym znajduje się wyświetlenie w bieżącym odtwarzaniu, oraz czy film (lub dźwięk) został odtworzony. Dostęp do tych informacji uzyskasz odpowiednio za pomocą tagów HTMLMediaElement.duration, HTMLMediaElement.currentTime i HTMLMediaElement.ended.

Dostępne interfejsy elementów

Większość elementów HTML, które omówiliśmy do tej pory w tej serii, a także te, które jeszcze omówimy, z wyjątkiem niektórych elementów dzielenia na sekcje, ma powiązany interfejs DOM. Podstawowy interfejs wszystkich elementów nosi trafną nazwę Element. Interfejs HTMLElement dziedziczy po elemencie, a z niego dziedziczą wszystkie interfejsy związane z elementem HTML. Niektóre interfejsy dla konkretnych elementów są implementowane przez wiele podobnych elementów.

Interfejsy:

Konwencja nazewnictwa to „HTML”, po którym następuje element lub grupa elementów w wielkich literach w alfabecie łacińskim, a następnie „Element”, ale element lub grupa elementów nie muszą być zgodne z żadnym wzorcem. Nie przejmuj się. Nie musisz ich zapamiętywać. Ważne jest, aby wiedzieć, że takie opcje istnieją, aby można było z nich skorzystać w razie potrzeby.

Jeśli masz kolekcję elementów, możesz też korzystać z interfejsów kolekcji. Na przykład metoda HTMLCollection.namedItem() zwraca pierwszy element w zbiorze, którego atrybut id lub name pasuje do parametru, albo wartość null, jeśli żaden element nie pasuje.

Ponad 30 elementów nie ma powiązanego interfejsu DOM poza HTMLElement, w tym <address>, <article>, <section>, <nav>, <header>, <footer>, <aside><hgroup>. Wiele elementów, które nie obsługują żadnych atrybutów niewycofanych ani globalnych, ma interfejsy specyficzne dla danego elementu, takie jak HTMLPElement (element <p>) i HTMLUnknownElement (<😃> lub inne elementy, które nie są zdefiniowane), ale te interfejsy nie implementują żadnych dodatkowych właściwości ani metod poza tymi, które zostały dziedziczone z HTMLElement, i nie są wymienione powyżej.

Zbędne metody i właściwości interfejsu API

Jeśli interfejs ma taką samą nazwę metody lub właściwości co interfejs, z którego dziedziczy, dziedziczona metoda lub właściwość zastępuje dziedziczoną. Innymi słowy, metody i właściwości nadrzędne zastępują te podrzędne. Gdy uzyskaliśmy dostęp do właściwości altoffsetHeightinterfejsach API elementu HTML (odpowiednio imageInstance.altsectionInstance.offsetHeight), kod nie wskazywał, do którego interfejsu API uzyskiwał dostęp. W przypadku tych 2 przykładów nie ma to większego znaczenia.

Są jednak sytuacje, w których nadmiarowość może stanowić problem. Na przykład HTMLCollection.length jest tylko do odczytu, a interfejs dziedziczący HTMLOptionsCollection ma właściwość długości (zwracaną tylko przez właściwość options obiektu <select>) z dostępem do odczytu i zapisu. Parametru HTMLOptionsCollection można użyć do określenia rozmiaru kolekcji.

Inne interfejsy

Istnieją dodatkowe interfejsy, które umożliwiają manipulowanie lokalizacjami gałęzi węzłów DOM. Interfejs EventTarget, który udostępnia nam metody addEventListener()removeEventListener(), jest dziedziczony przez interfejsy NodeWindow. Z kolei interfejsy Element, Document i DocumentFragment (które widzieliśmy w sekcji Elementy niestandardowe) dziedziczą z Node, a interfejs HTMLElement dziedziczy z Element.

Interfejs node

Każdy typ węzła DOM jest reprezentowany przez interfejs oparty na Node, który udostępnia informacje i metody w postaci elementów związanych z drzewem DOM. Interfejs Node umożliwia wysyłanie zapytań i dodawanie węzłów do drzewa węzłów.

Słynne rozwiązanie Douglasa Crockforda „przechodzenie się po DOM” korzysta z właściwości firstChildnextSibling węzła.

const walk_the_DOM = function walk(node, callback) {
  callback(node);
  node = node.firstChild;
  while (node) {
    walk(node, callback);
    node = node.nextSibling;
  }
};

Do definiowania elementów niestandardowych użyliśmy metod Node appendChild()cloneNode(). Interfejs Node udostępnia wiele przydatnych właściwości i metod do wykonywania zapytań i modyfikowania DOM.

customElements.define('star-rating',
  class extends HTMLElement {
    constructor() {
      super(); // Always call super first in constructor
      const starRating = document.getElementById('star-rating-template').content;
      const shadowRoot = this.attachShadow({
        mode: 'open'
      });
      shadowRoot.appendChild(starRating.cloneNode(true));
    }
  });

Metoda attachShadow() jest metodą interfejsu Element. Dostępny jest też interfejs shadowRoot dla interfejsu Shadow DOM API renderowanego oddzielnie od głównego drzewa DOM dokumentu.

Interfejsy DocumentHTMLDocument

Interfejs Document dziedziczy z poziomu Node. Reprezentuje stronę internetową wczytaną w przeglądarce, niezależnie od tego, czy dokument jest w formacie HTML, SVG, XML, MathML czy innym. Interfejs Document dziedziczy też z interfejsu HTMLDocument.

Panel document zapewnia szybki dostęp do typów węzłów oraz możliwość tworzenia kolekcji określonych typów elementów, takich jak document.body i document.styleSheets. Obiekt HTMLDocument umożliwia dostęp do informacji związanych z dokumentem, których nie ma w węzłach HTML, takich jak Document.location, Document.lastModifiedDocument.Cookie.

Dostępnych jest kilka interfejsów API na podstawie funkcji wyświetlanych w interfejsie dokumentu, w tym interfejs API przeciągania i upuszczania oraz interfejs API pełnoekranowego. Oba dziedziczą z poziomu Element.

Interfejs Window

Interfejs okna zawiera dostępne globalnie elementy poza interfejsem DOM, które można wykorzystać do manipulowania interfejsem DOM. Okno udostępnia funkcje, przestrzenie nazw, obiekty i konstruktory opisane w dokumentacji MDN dotyczącej JavaScriptodwołań do DOM.

Interfejs Window to interfejs API obiektu zawierającego dokument. Obiekt globalny window to okno, w którym działa skrypt. Każda karta przeglądarki zawiera własny obiekt Window. Interfejs okna może wysyłać zapytania dotyczące zawartości karty, a także całego okna i urządzenia. Na przykład metody resizeTo() można używać do zmiany rozmiaru okna przeglądarki, a właściwość devicePixelRatio zapewnia dostęp do pikseli wyświetlacza urządzenia. Jeśli chcesz uzyskać informacje o karcie, na której znajdują się treści, a nie o drzewie DOM, które wyświetla karta, to prawdopodobnie szukasz okna.

Dostępnych jest kilka interfejsów API opartych na funkcjach wyświetlanych w interfejsie okna, w tym interfejsy Web WorkersIndexedDB.

Sprawdź swoją wiedzę

Sprawdź swoją wiedzę na temat interfejsów HTML API.

Co oznacza litera „O” w akronimie DOM?

Orientacja.
Spróbuj ponownie.
Obiekt.
Dobrze!
Zewnętrzny.
Spróbuj ponownie.

Który interfejs może Ci pomóc znaleźć informacje o karcie, na której znajdują się treści?

Okno
Dobrze!
Dokument
Spróbuj ponownie.
Węzeł
Spróbuj ponownie.