Beberapa klarifikasi tentang DOM

25

Saya telah mencoba memahami DOM, dan meskipun saya memiliki gagasan yang adil tentang apa itu, ada beberapa ide yang tidak dapat saya uraikan. Saya akan mencantumkan apa yang saya pikirkan tentang DOM dan pertanyaan saya akan sesuai.

  1. DOM adalah representasi sepenuhnya berorientasi objek dari halaman web. Standar DOM W3C membentuk dasar DOM yang diterapkan di sebagian besar browser modern.

    Jadi apakah DOM berbicara tentang bagaimana dokumen XML / HTML direpresentasikan sebagai model objek?

  2. DOM tidak menentukan bahwa dokumen harus diimplementasikan sebagai pohon atau hutan, juga tidak menentukan bagaimana hubungan antara objek diimplementasikan.

    Dengan cara apa lagi dokumen itu dapat diwakili?

  3. Ketika Anda melakukan sesuatu seperti ini -

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

    objek dokumen disediakan oleh DOM. Metode menulis adalah antarmuka yang terkena JavaScript oleh DOM.

    Jadi objek dan metodenya dibuat sebagai objek JavaScript oleh parser DOM dan kemudian disajikan ke mesin JavaScript? Atau apakah objek dan metode dalam mesin parsing DOM dalam bahasa asli mereka sendiri? Dan apakah terkena mesin JavaScript? Jika demikian, lalu apa yang bertanggung jawab untuk menerjemahkan dari JavaScript ke bahasa asli?

  4. Apa itu ikatan bahasa?

    Penjilidan bahasa adalah himpunan objek asli ke bahasa yang bersangkutan yang mengimplementasikan masing-masing antarmuka dalam spesifikasi DOM.

    Pengembang dapat membuat binding bahasa dari DOM ke bahasa mereka hanya dengan mengikuti IDL (Interface Definition Language) dalam spesifikasi DOM.

    Jadi jika mesin parsing DOM diimplementasikan dalam katakanlah C ++, apakah itu berarti bahwa ketika Anda membuat binding bahasa dengan mengikuti IDL, Anda hanya membuat objek dalam bahasa tertentu, yaitu C ++ yang dibuat dengan mesin parsing DOM Anda?

pengguna1720897
sumber
@apsillers Seharusnya "Jadi apakah DOM berbicara tentang bagaimana dokumen XML / HTML direpresentasikan sebagai model objek?" Saya telah mengedit posting.
user1720897
Saya akan menjawab apa yang saya bisa di komentar. 3 & 4 mungkin membawa seseorang yang mengembangkan browser untuk benar-benar menjawab dan saya tidak ingin memengaruhi jumlah jawaban. 1 - browser memiliki pemahaman tentang kondisi dokumen saat ini, Anda dapat menyebutnya DOM, atau Anda dapat memanggil DOM antarmuka standar yang ditampilkan yang memungkinkan Anda untuk menanyakan dan memodifikasi status dokumen.
George Mauer
2 - Pernyataan ini tentang implementasi, bukan representasi. Kecuali saya salah, '' representasi '' memang harus menjadi pohon. Implementasi di balik layar tidak.
George Mauer

Jawaban:

19

Berikut ini adalah bacaan terbaik saya dari spesifikasi dan referensi yang relevan. (Saya menemukan abstrak Mozilla tentang tingkat DOM dan tautan terkait sangat membantu.) Saya mendorong koreksi atau klarifikasi dari orang lain.

Jadi apakah DOM berbicara tentang bagaimana dokumen XML / HTML direpresentasikan sebagai model objek?

Iya nih. Ada dua bagian spesifikasi DOM Level 1 - Core dan HTML . Spesifikasi Core DOM menggambarkan DOM umum yang dapat digunakan untuk mewakili dokumen terstruktur. The HTML DOM spesifikasi menjelaskan bagaimana menggunakan Core DOM untuk menggambarkan dokumen HTML khusus dan termasuk antarmuka HTML-spesifik.

DOM tidak menentukan bahwa dokumen harus diimplementasikan sebagai pohon atau hutan, juga tidak menentukan bagaimana hubungan antara objek diimplementasikan. Dengan cara apa lagi dokumen itu dapat diwakili?

DOM Inti tidak menganggap bahwa dokumen tersebut adalah pohon. The Nodeantarmuka adalah "... datatype utama untuk seluruh [DOM]. Ini merupakan node tunggal di pohon dokumen ." Nodememiliki beberapa properti untuk mengakses anak-anak, saudara kandung, dan simpul orangtua (mis parentNode. frstChild,, dll.) yang menyiratkan struktur pohon. Anda bisa menggunakan pohon datar atau pohon linier (misalnya, daftar tertaut), tetapi masih berupa pohon.

Seperti yang ditunjukkan George Mauer dalam komentar, mungkin maksud Anda bahwa model yang mendasari implementasi tertentu tidak perlu berupa pohon. Itu benar; selama implementasi Anda menyediakan fungsionalitas yang dijanjikan dalam spesifikasi DOM, Anda dapat menggunakan struktur apa pun yang Anda suka untuk menyediakan fungsionalitas itu.

Apakah objek dan metode dalam mesin parsing DOM dalam bahasa asli mereka sendiri?

Secara umum, ya . Di sebagian besar browser, DOM diimplementasikan dalam bahasa tingkat rendah seperti C, dan browser memasok binding ke lingkungan JavaScript yang dapat memanipulasi representasi aktual. Bahkan, jika Anda melihat pertanyaan Arti dari "Memindahkan DOM ke Javascript"? , Anda akan melihat bahwa Google tertarik untuk beralih ke implementasi DOM JavaScript asli (kemungkinan untuk menghindari membutuhkan fungsi C ++ dan pembungkus JavaScript duplikat untuk fungsi C ++; mungkin juga untuk keuntungan kinerja).

apa yang bertanggung jawab untuk menerjemahkan dari JavaScript ke bahasa asli?

Saya agak sedikit kabur tentang hal ini, tetapi pemahaman saya adalah bahwa ketika JavaScript DOM mengikat dipanggil, lingkungan eksekusi JavaScript (yang dengan sendirinya diimplementasikan dalam bahasa tingkat rendah seperti C) melakukan panggilan ke fungsi DOM yang relevan (ditulis dalam C / C ++) untuk memanipulasi DOM.

Jika Anda ingin lebih dalam dari itu, Anda harus berbicara dengan seseorang yang benar-benar membuat peramban.

apakah itu berarti bahwa ketika Anda membuat binding bahasa dengan mengikuti IDL, Anda hanya membuat objek dalam bahasa tertentu, yaitu C ++ yang dibuat dengan mesin parsing DOM Anda?

Iya nih. IDL DOM adalah agnostik bahasa, sehingga Anda dapat mengimplementasikannya dalam bahasa apa pun. "Menulis implementasi DOM" berarti menulis kode (dalam bahasa tertentu) agar sesuai dengan antarmuka IDL yang dijelaskan dalam spesifikasi DOM.

apsillers
sumber
Saya percaya binding harus melibatkan dua hal. Meminta run-time asli melalui referensi dan beberapa cara untuk mengambil acara dari implementasi asli. Anda benar-benar dapat melihat metode apa yang hanya pembungkus kode asli di browser dengan konsol yang mencatatnya. misalnya console.log(document.write);atau console.log(document.constructor);- tambahkan .toString()param log di browser yang tidak memberi Anda teks fungsi. Objek tidak harus memiliki setara cermin dalam kode asli. Juga, sebagian besar properti objek DOM sebenarnya getter dengan perilaku terkait.
Erik Reppen