Alguns esclarecimentos sobre o DOM


25

Eu tenho tentado entender o DOM e, embora eu tenha uma boa idéia do que é, há certas idéias que simplesmente não consigo definir. Vou listar o que eu acho que é o DOM e minhas perguntas estarão em linha.

  1. O DOM é uma representação totalmente orientada a objeto da página da web. O padrão DOM do W3C forma a base do DOM implementado na maioria dos navegadores modernos.

    Então, o DOM fala sobre como um documento XML / HTML é representado como um modelo de objeto?

  2. O DOM não especifica que os documentos devem ser implementados como uma árvore ou bosque, nem especifica como os relacionamentos entre objetos são implementados.

    De que outras maneiras o documento pode ser representado?

  3. Quando você faz algo assim -

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

    o objeto de documento é fornecido pelo DOM. Os métodos de gravação são as interfaces expostas ao JavaScript pelo DOM.

    Portanto, os objetos e seus métodos são criados como objetos JavaScript pelo analisador DOM e apresentados ao mecanismo JavaScript? Ou os objetos e métodos no mecanismo de análise do DOM estão em seu próprio idioma nativo? E está exposto ao mecanismo JavaScript? Se é assim, então o que é responsável pela tradução do JavaScript para o idioma nativo?

  4. O que são ligações de idiomas?

    A ligação de idioma é o conjunto de objetos nativos para o idioma em questão que implementa cada uma das interfaces na especificação DOM.

    Os desenvolvedores podem criar ligações de idioma do DOM para o idioma deles simplesmente seguindo o IDL (Interface Definition Language) na especificação do DOM.

    Portanto, se o mecanismo de análise do DOM for implementado como, por exemplo, C ++, isso significa que, quando você cria ligações de idiomas seguindo o IDL, está apenas criando objetos na linguagem específica, ou seja, C ++ com o qual o seu mecanismo de análise do DOM é construído?


@apsillers Deveria ter sido "Então o DOM fala sobre como um documento XML / HTML é representado como um modelo de objeto?" Eu editei a postagem.
precisa saber é o seguinte

Vou responder o que puder nos comentários. 3 e 4 podem levar alguém que desenvolve navegadores a realmente responder e eu não quero afetar a contagem de respostas. 1 - o navegador tem uma compreensão do estado atual do documento, você pode chamar isso de DOM; alternativamente, você pode chamar o DOM de interfaces padrão que ele expõe, que permitem consultar e modificar o estado do documento.
George Mauer

2 - A afirmação é sobre implementação, não representação. A menos que eu esteja enganado, a '' representação '' precisa ser uma árvore. A implementação dos bastidores não.
21813 George Mauer #

Respostas:


19

A seguir, é minha melhor leitura das especificações e referências relevantes. (Achei os resumos da Mozilla sobre os níveis DOM e os links associados especialmente úteis.) Encorajo correções ou esclarecimentos de outras pessoas.

Então, o DOM fala sobre como um documento XML / HTML é representado como um modelo de objeto?

Sim. Existem duas partes na especificação do nível 1 do DOM - Core e HTML . A especificação Core DOM descreve um DOM geral que pode ser usado para representar qualquer documento estruturado. A especificação HTML DOM descreve como usar o DOM principal para descrever documentos HTML especificamente e inclui interfaces específicas para HTML.

O DOM não especifica que os documentos devem ser implementados como uma árvore ou bosque, nem especifica como os relacionamentos entre objetos são implementados. De que outras maneiras o documento pode ser representado?

DOM Núcleo faz supor que o documento é uma árvore. A Nodeinterface é o "... tipo de dados primário para todo o [DOM]. Representa um único nó na árvore de documentos ". Nodetem várias propriedades para crianças acessam, irmão, e nós pai (por exemplo, parentNode, frstChild, etc.) que implica uma estrutura de árvore. Você pode usar uma árvore plana ou linear (por exemplo, uma lista vinculada), mas ainda será uma forma de árvore.

Como George Mauer aponta nos comentários, talvez você queira dizer que o modelo subjacente de uma implementação específica não precisa ser uma árvore. Isso é verdade; contanto que sua implementação forneça a funcionalidade prometida na especificação do DOM, você poderá usar qualquer estrutura que desejar para fornecer essa funcionalidade.

Os objetos e métodos no mecanismo de análise do DOM estão em seu próprio idioma nativo?

Geralmente sim . Na maioria dos navegadores, o DOM é implementado em uma linguagem de nível inferior, como C, e o navegador fornece ligações ao ambiente JavaScript que pode manipular as representações reais. De fato, se você olhar para a pergunta Significado de "Movendo DOM para Javascript"? , você verá que o Google está interessado em mudar para uma implementação DOM JavaScript nativa (provavelmente evitará a necessidade de uma função C ++ e de um wrapper JavaScript duplicado para essa função C ++; possivelmente também de ganhos de desempenho).

o que é responsável pela tradução do JavaScript para o idioma nativo?

Estou um pouco mais preocupado com esse assunto, mas meu entendimento é que, quando uma ligação JavaScript DOM é invocada, o ambiente de execução JavaScript (que é implementado em uma linguagem de nível inferior como C) faz uma chamada para a função DOM relevante (escrito em C / C ++) para manipular o DOM.

Se você quiser ir mais fundo do que isso, precisará conversar com alguém que realmente faz navegadores.

isso significa que, quando você cria ligações de idiomas seguindo o IDL, está apenas criando objetos na linguagem específica, ou seja, C ++ com o qual seu mecanismo de análise DOM é construído?

Sim. O IDL do DOM é independente de idioma, para que você possa implementá-lo em qualquer idioma. "Gravando uma implementação DOM" significa escrever código (em um idioma específico) para estar em conformidade com as interfaces IDL descritas nas especificações DOM.


Acredito que as ligações teriam que envolver duas coisas. Invocando o tempo de execução nativo por meio de referências e de alguma maneira para selecionar eventos da implementação nativa. Você pode realmente ver quais métodos são apenas invólucros de código nativo nos navegadores pelo console, registrando-os normalmente. por exemplo, console.log(document.write);ou console.log(document.constructor);- adicione .toString()o parâmetro de log nos navegadores que não fornecem o texto da função. Objetos não necessariamente teriam um equivalente espelhado no código nativo. Além disso, a maioria das propriedades de objetos DOM são na verdade getters com comportamento associado.
Erik Reppen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.