Kilka wyjaśnień na temat DOM

25

Próbowałem zrozumieć DOM i chociaż mam dobre wyobrażenie o tym, co to jest, są pewne pomysły, których po prostu nie potrafię określić. Spiszę, co myślę, że DOM jest, i moje pytania będą w linii.

  1. DOM jest w pełni obiektową reprezentacją strony internetowej. Standard DOM W3C stanowi podstawę modelu DOM zaimplementowanego w większości nowoczesnych przeglądarek.

    Czy więc DOM mówi o tym, jak dokument XML / HTML jest reprezentowany jako model obiektowy?

  2. DOM nie określa, że ​​dokumenty muszą zostać zaimplementowane jako drzewo lub gaj, ani nie określa, w jaki sposób należy zaimplementować relacje między obiektami.

    W jaki inny sposób można przedstawić dokument?

  3. Kiedy robisz coś takiego -

    document.write('welcome to my home page!');

    obiekt dokumentu jest dostarczany przez DOM. Metody zapisu to interfejsy, które są narażone na JavaScript przez DOM.

    Więc obiekty i metody są tworzone przez obiekt parsera jako obiekty JavaScript, a następnie przedstawiane silnikowi JavaScript? A może obiekty i metody w silniku analizującym DOM są w ich własnym języku ojczystym? I jest narażony na działanie silnika JavaScript? Jeśli tak, to co jest odpowiedzialne za tłumaczenie z JavaScript na język ojczysty?

  4. Co to są powiązania językowe?

    Powiązanie językowe to zestaw obiektów rodzimych dla danego języka, który implementuje każdy interfejs w specyfikacji DOM.

    Programiści mogą tworzyć powiązania językowe z DOM do swojego języka, po prostu postępując zgodnie z IDL (Interface Definition Language) w specyfikacji DOM.

    Więc jeśli silnik analizujący DOM jest zaimplementowany w powiedzmy C ++, czy to oznacza, że ​​kiedy tworzysz powiązania językowe, postępując zgodnie z IDL, po prostu tworzysz obiekty w określonym języku, tj. C ++, z którym zbudowany jest twój silnik analizujący DOM?

użytkownik1720897
źródło
@apsillers Powinno być „Czy DOM mówi o tym, jak dokument XML / HTML jest reprezentowany jako model obiektowy?” Zredagowałem post.
user1720897
Odpowiem co mogę w komentarzach. 3 i 4 mogą zająć kogoś, kto opracuje przeglądarki, aby naprawdę odpowiedzieć, a ja nie chcę wpływać na liczbę odpowiedzi. 1 - przeglądarka rozumie bieżący stan dokumentu, możesz nazwać to DOM, alternatywnie możesz nazwać DOM standardowymi interfejsami, które udostępnia, które pozwalają na zapytanie i modyfikację stanu dokumentu.
George Mauer,
2 - Oświadczenie dotyczy implementacji, a nie reprezentacji. O ile się nie mylę, „reprezentacja” musi być drzewem. Realizacja za kulisami nie.
George Mauer

Odpowiedzi:

19

Poniżej znajduje się moja najlepsza lektura odpowiednich specyfikacji i odniesień. (Uważam, że streszczenia Mozilli na temat poziomów DOM i powiązane linki są szczególnie pomocne.) Zachęcam do poprawiania lub wyjaśniania przez innych.

Czy więc DOM mówi o tym, jak dokument XML / HTML jest reprezentowany jako model obiektowy?

Tak. Specyfikacja DOM Level 1 składa się z dwóch części - Core i HTML . Rdzeń specyfikacji DOM opisuje ogólną DOM, które mogłyby zostać wykorzystane do reprezentowania dowolnego dokumentu strukturyzowanych. Specyfikacja HTML DOM opisuje, jak używać Core DOM do specyficznego opisywania dokumentów HTML i zawiera interfejsy specyficzne dla HTML.

DOM nie określa, że ​​dokumenty muszą zostać zaimplementowane jako drzewo lub gaj, ani nie określa, w jaki sposób należy zaimplementować relacje między obiektami. W jaki inny sposób można przedstawić dokument?

DOM Rdzeń ma założyć, że dokument jest drzewem. NodeInterfejs jest „... podstawowym typem danych dla całego [DOM]. Reprezentuje pojedynczy węzeł w drzewie dokumentu .” Nodema kilka właściwości dostępu do dzieci, rodzeństwo i węzłów nadrzędnych (np parentNode, frstChilditp), które implikuje strukturę drzewa. Możesz użyć drzewa płaskiego lub liniowego (np. Połączonej listy), ale nadal będzie to jakaś forma drzewa.

Jak zauważył George Mauer w komentarzach, być może masz na myśli, że podstawowym modelem konkretnej implementacji nie musi być drzewo. Tyle jest prawdą; tak długo, jak twoja implementacja zapewnia funkcjonalność obiecaną w specyfikacji DOM, możesz używać dowolnej struktury, którą chcesz zapewnić.

Czy obiekty i metody w silniku analizującym DOM są w swoim własnym języku ojczystym?

Ogólnie tak . W większości przeglądarek DOM jest implementowany w języku niższego poziomu, takim jak C, a przeglądarka dostarcza powiązania ze środowiskiem JavaScript, które mogą manipulować rzeczywistymi reprezentacjami. W rzeczywistości, jeśli spojrzysz na pytanie Znaczenie „Przenoszenie DOM do Javascript”? , zobaczysz, że Google jest zainteresowany przejściem na natywną implementację DOM JavaScript JavaScript (prawdopodobnie uniknie to zarówno funkcji C ++, jak i duplikatu opakowania JavaScript dla tej funkcji C ++; być może również w celu zwiększenia wydajności).

co jest odpowiedzialne za tłumaczenie z JavaScript na język ojczysty?

Jestem trochę bardziej ryzykowny w tym temacie, ale rozumiem, że gdy wywoływane jest powiązanie DOM JavaScript, środowisko wykonawcze JavaScript (które jest zaimplementowane w języku niższego poziomu, takim jak C), wywołuje odpowiednią funkcję DOM (napisany w C / C ++) do manipulowania DOM.

Jeśli chcesz zejść głębiej, musisz porozmawiać z kimś, kto faktycznie tworzy przeglądarki.

Czy to oznacza, że ​​kiedy tworzysz powiązania językowe, postępując zgodnie z IDL, po prostu tworzysz obiekty w określonym języku, tj. C ++, z którym zbudowany jest silnik analizujący DOM?

Tak. IDL DOM jest niezależny od języka, dzięki czemu można go wdrożyć w dowolnym języku. „Pisanie implementacji DOM” oznacza pisanie kodu (w określonym języku) w celu dostosowania do interfejsów IDL opisanych w specyfikacjach DOM.

apsillery
źródło
Uważam, że powiązania musiałyby obejmować dwie rzeczy. Wywoływanie natywnego środowiska wykonawczego za pomocą referencji i sposób odbierania zdarzeń z natywnej implementacji. Możesz faktycznie zobaczyć, jakie metody są po prostu natywnymi opakowaniami kodu w przeglądarkach, logując je zwykle przez konsolę. np. console.log(document.write);lub console.log(document.constructor);- dodaj .toString()parametr dziennika w przeglądarkach, które nie wyświetlają tekstu funkcji. Obiekty niekoniecznie miałyby dublowany odpowiednik w natywnym kodzie. Ponadto większość właściwości obiektów DOM to tak naprawdę gettery z powiązanym zachowaniem.
Erik Reppen