Algunas aclaraciones sobre el DOM

25

He estado tratando de entender el DOM, y aunque tengo una idea clara de lo que es, hay ciertas ideas que simplemente no puedo precisar. Voy a enumerar lo que creo que es el DOM y mis preguntas estarán en línea.

  1. El DOM es una representación totalmente orientada a objetos de la página web. El estándar W3C DOM forma la base del DOM implementado en la mayoría de los navegadores modernos.

    Entonces, ¿habla el DOM sobre cómo un documento XML / HTML se representa como un modelo de objeto?

  2. El DOM no especifica que los documentos deben implementarse como un árbol o una arboleda, ni especifica cómo se implementan las relaciones entre los objetos.

    ¿De qué otras formas se puede representar el documento?

  3. Cuando haces algo como esto ...

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

    El objeto del documento es proporcionado por el DOM. Los métodos de escritura son las interfaces que el DOM expone a JavaScript.

    Entonces, ¿los objetos y sus métodos son creados como objetos JavaScript por el analizador DOM y luego presentados al motor JavaScript? ¿O los objetos y métodos dentro del motor de análisis DOM están en su propio idioma nativo? ¿Y está expuesto al motor de JavaScript? Si es así, ¿qué es responsable de traducir de JavaScript al idioma nativo?

  4. ¿Qué son los enlaces de idiomas?

    El enlace de idioma es el conjunto de objetos nativos del idioma en cuestión que implementa cada una de las interfaces en la especificación DOM.

    Los desarrolladores pueden crear enlaces de idiomas desde el DOM a su idioma simplemente siguiendo el IDL (lenguaje de definición de interfaz) en la especificación DOM.

    Entonces, si el motor de análisis DOM se implementa en, por ejemplo, C ++, ¿eso significa que cuando crea enlaces de lenguaje siguiendo el IDL, solo está creando objetos en el lenguaje específico, es decir, C ++ con el que está construido su motor de análisis DOM?

usuario1720897
fuente
@apsillers Debería haber sido "¿Entonces el DOM habla de cómo un documento XML / HTML se representa como un modelo de objeto?" He editado la publicación.
user1720897
Contestaré lo que pueda en los comentarios. 3 y 4 pueden tomar a alguien que desarrolla navegadores para responder realmente y no quiero afectar el conteo de respuestas. 1 - el navegador comprende el estado actual del documento, puede llamarlo DOM, alternativamente puede llamar al DOM las interfaces estándar que expone que le permiten consultar y modificar el estado del documento.
George Mauer
2 - La declaración trata sobre la implementación, no sobre la representación. A menos que me equivoque, la "representación" tiene que ser un árbol. La implementación detrás de escena no.
George Mauer

Respuestas:

19

Lo que sigue es mi mejor lectura de las especificaciones y referencias relevantes. (Encontré los resúmenes de Mozilla sobre los niveles de DOM y los enlaces asociados especialmente útiles). Animo las correcciones o aclaraciones de otros.

Entonces, ¿habla el DOM sobre cómo un documento XML / HTML se representa como un modelo de objeto?

Sí. La especificación DOM Nivel 1 tiene dos partes: Core y HTML . La especificación Core DOM describe un DOM general que podría usarse para representar cualquier documento estructurado. La especificación HTML DOM describe cómo usar Core DOM para describir documentos HTML específicamente e incluye interfaces específicas de HTML.

El DOM no especifica que los documentos deben implementarse como un árbol o una arboleda, ni especifica cómo se implementan las relaciones entre los objetos. ¿De qué otras formas se puede representar el documento?

DOM Core no asuma que el documento es un árbol. La Nodeinterfaz es el "... tipo de datos primario para todo el [DOM]. Representa un nodo único en el árbol de documentos ". Nodetiene varias propiedades para acceder a los nodos hijos, hermanos y padres (p. ej parentNode. frstChild, etc.) que implica una estructura de árbol. Podría usar un árbol plano o un árbol lineal (p. Ej., Una lista vinculada), pero seguirá siendo algún tipo de árbol.

Como señala George Mauer en los comentarios, quizás quiera decir que el modelo subyacente de una implementación particular no necesita ser un árbol. Eso es cierto; siempre que su implementación proporcione la funcionalidad prometida en la especificación DOM, puede usar la estructura que desee para proporcionar esa funcionalidad.

¿Están los objetos y métodos dentro del motor de análisis DOM en su propio idioma nativo?

En general si . En la mayoría de los navegadores, el DOM se implementa en un lenguaje de nivel inferior como C, y el navegador proporciona enlaces al entorno de JavaScript que pueden manipular las representaciones reales. De hecho, si nos fijamos en la pregunta ¿ Significado de "Mover DOM a Javascript"? , verá que Google está interesado en cambiar a una implementación DOM de JavaScript nativa (es probable que evite la necesidad de una función C ++ y un contenedor de JavaScript duplicado para esa función C ++; posiblemente también para aumentar el rendimiento).

¿Qué es responsable de traducir de JavaScript al idioma nativo?

Soy un poco más peligroso sobre este tema, pero entiendo que cuando se invoca un enlace DOM de JavaScript, el entorno de ejecución de JavaScript (que en sí se implementa en un lenguaje de nivel inferior como C) llama a la función DOM relevante (escrito en C / C ++) para manipular el DOM.

Si quieres profundizar más que eso, deberás hablar con alguien que realmente haga navegadores.

¿eso significa que cuando crea enlaces de idioma siguiendo el IDL, solo está creando objetos en el lenguaje específico, es decir, C ++ con el que está construido su motor de análisis DOM?

Sí. El IDL del DOM es independiente del idioma, por lo que puede implementarlo en cualquier idioma. "Escribir una implementación DOM" significa escribir código (en un idioma particular) para cumplir con las interfaces IDL descritas en las especificaciones DOM.

apsillers
fuente
Creo que los enlaces tendrían que implicar dos cosas. Invocar el tiempo de ejecución nativo a través de referencias y alguna forma de recoger eventos de la implementación nativa. En realidad, puede ver qué métodos son solo envoltorios de código nativo en los navegadores al registrarlos en la consola normalmente. por ejemplo, console.log(document.write);o console.log(document.constructor);: agregue .toString()el parámetro de registro en los navegadores que no le proporcionan el texto de la función. Los objetos no tendrían necesariamente un equivalente reflejado en el código nativo. Además, la mayoría de las propiedades del objeto DOM son realmente captadores con comportamiento asociado.
Erik Reppen