Alcuni chiarimenti sul DOM


25

Ho cercato di capire il DOM, e anche se ho una buona idea di cosa sia, ci sono alcune idee che non riesco proprio a definire. Elencherò ciò che penso sia il DOM e le mie domande saranno in linea.

  1. Il DOM è una rappresentazione completamente orientata agli oggetti della pagina Web. Lo standard DOM W3C costituisce la base del DOM implementato nella maggior parte dei browser moderni.

    Quindi il DOM parla di come viene rappresentato un documento XML / HTML come modello a oggetti?

  2. Il DOM non specifica che i documenti devono essere implementati come un albero o un boschetto, né specifica come implementare le relazioni tra gli oggetti.

    In quali altri modi è possibile rappresentare il documento?

  3. Quando fai qualcosa del genere -

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

    l'oggetto documento è fornito dal DOM. I metodi di scrittura sono le interfacce esposte a JavaScript dal DOM.

    Quindi gli oggetti e i suoi metodi vengono creati come oggetti JavaScript dal parser DOM e quindi presentati al motore JavaScript? O gli oggetti e i metodi all'interno del motore di analisi DOM sono nella loro lingua madre? Ed è esposto al motore JavaScript? In tal caso, qual è la responsabilità della traduzione da JavaScript nella lingua madre?

  4. Quali sono i collegamenti linguistici?

    L'associazione linguistica è l'insieme di oggetti nativi della lingua in questione che implementa ciascuna delle interfacce nella specifica DOM.

    Gli sviluppatori possono creare collegamenti linguistici dal DOM alla loro lingua semplicemente seguendo l'IDL (Interface Definition Language) nelle specifiche DOM.

    Quindi, se il motore di analisi DOM è implementato in diciamo C ++, ciò significa che quando si creano associazioni di lingue seguendo l'IDL, si stanno semplicemente creando oggetti nella lingua specifica, ovvero C ++ con cui è costruito il motore di analisi DOM?


@apsillers Avrebbe dovuto essere "Quindi il DOM parla di come un documento XML / HTML è rappresentato come un modello a oggetti?" Ho modificato il post.
user1720897,

Risponderò a ciò che posso nei commenti. 3 e 4 potrebbero richiedere a qualcuno che sviluppa browser di rispondere davvero e non voglio influire sul conteggio delle risposte. 1 - il browser ha una comprensione dello stato corrente del documento, è possibile chiamare questo DOM, in alternativa è possibile chiamare il DOM le interfacce standard che espone che consentono di interrogare e modificare lo stato del documento.
George Mauer,

2 - La dichiarazione riguarda l'implementazione, non la rappresentazione. A meno che non mi sbagli, la '' rappresentazione '' deve essere un albero. L'implementazione dietro le quinte no.
George Mauer,

Risposte:


19

Quella che segue è la mia migliore lettura delle specifiche e dei riferimenti pertinenti. (Ho trovato particolarmente utili gli abstract di Mozilla sui livelli DOM e i link associati.) Incoraggio correzioni o chiarimenti da parte di altri.

Quindi il DOM parla di come viene rappresentato un documento XML / HTML come modello a oggetti?

Sì. Ci sono due parti della specifica DOM Livello 1: Core e HTML . Le specifiche DOM principali descrivono un DOM generale che potrebbe essere utilizzato per rappresentare qualsiasi documento strutturato. La specifica DOM HTML descrive come utilizzare il DOM principale per descrivere in modo specifico i documenti HTML e include interfacce specifiche per HTML.

Il DOM non specifica che i documenti devono essere implementati come un albero o un boschetto, né specifica come implementare le relazioni tra gli oggetti. In quali altri modi è possibile rappresentare il documento?

DOM core fa supporre che il documento è un albero. L' Nodeinterfaccia è il "... tipo di dati primario per l'intero [DOM]. Rappresenta un singolo nodo nella struttura del documento ." Nodeha diverse proprietà per l'accesso ai nodi figlio, fratello e genitore (ad es. parentNode,frstChild , etc.) che implica una struttura ad albero. Potresti usare un albero piatto o un albero lineare (ad esempio un elenco collegato), ma sarà comunque una forma di albero.

Come sottolinea George Mauer nei commenti, forse intendi dire che il modello sottostante di una particolare implementazione non deve necessariamente essere un albero. Questo è vero; purché l'implementazione fornisca la funzionalità promessa nella specifica DOM, è possibile utilizzare la struttura desiderata per fornire tale funzionalità.

Gli oggetti e i metodi all'interno del motore di analisi DOM sono nella loro lingua madre?

Generalmente, . Nella maggior parte dei browser, il DOM è implementato in un linguaggio di livello inferiore come C e il browser fornisce collegamenti all'ambiente JavaScript in grado di manipolare le rappresentazioni effettive. In effetti, se guardi alla domanda Significato di "Spostare il DOM in Javascript"? , vedrai che Google è interessato al passaggio a un'implementazione DOM nativa di JavaScript (probabilmente per evitare la necessità sia di una funzione C ++ sia di un wrapper JavaScript duplicato per quella funzione C ++; possibilmente anche per miglioramenti delle prestazioni).

che cosa è responsabile della traduzione da JavaScript alla lingua madre?

Sono un po 'più confuso su questo argomento, ma la mia comprensione è che quando viene invocato un binding DOM JavaScript, l'ambiente di esecuzione JavaScript (che è esso stesso implementato in un linguaggio di livello inferiore come C) fa una chiamata alla relativa funzione DOM (scritto in C / C ++) per manipolare il DOM.

Se vuoi approfondire, dovrai parlare con qualcuno che crea effettivamente i browser.

vuol dire che quando crei i collegamenti linguistici seguendo l'IDL, stai semplicemente creando oggetti nella lingua specifica, ovvero C ++ con cui è costruito il tuo motore di analisi DOM?

Sì. L'IDL del DOM è indipendente dalla lingua, pertanto è possibile implementarlo in qualsiasi lingua. "Scrivere un'implementazione DOM" significa scrivere codice (in una lingua particolare) per conformarsi alle interfacce IDL descritte nelle specifiche DOM.


Credo che i vincoli dovrebbero comportare due cose. Richiamo del runtime nativo tramite riferimenti e un modo per raccogliere eventi dall'implementazione nativa. Puoi effettivamente vedere quali metodi sono solo wrapper di codice nativo nei browser registrandoli in genere dalla console. ad esempio console.log(document.write);oppure console.log(document.constructor);- aggiungi .toString()il parametro di registro nei browser che non forniscono il testo della funzione. Gli oggetti non avrebbero necessariamente un equivalente speculare nel codice nativo. Inoltre, la maggior parte delle proprietà degli oggetti DOM sono effettivamente getter con comportamento associato.
Erik Reppen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.