Apa alasan browser tidak mengenali dengan benar:
<script src="foobar.js" /> <!-- self-closing script element -->
Hanya ini yang dikenali:
<script src="foobar.js"></script>
Apakah ini mematahkan konsep dukungan XHTML?
Catatan: Pernyataan ini setidaknya benar untuk semua IE (6-8 beta 2).
javascript
html
internet-explorer
xhtml
dimarzionis
sumber
sumber
Jawaban:
Spesifikasi XHTML 1 mengatakan:
С.3 Minimisasi Elemen dan Konten Elemen Kosong
XHTML DTD menetapkan elemen skrip sebagai:
sumber
<script />
bukan karena spesifikasi tidak mengizinkannya, tetapi browser tidak menafsirkannya sebagai "non-tag-soup" jika jenis kontennya bukan application / xhtml + xml. Lihat: stackoverflow.com/questions/348736/... @shabunc: peramban mungkin tampaknya memahaminya, tetapi yang sebenarnya terjadi adalah meletakkan konten setelah <p /> di dalam paragraf, karena menafsirkan kutipan skuadron berarti bahwa sejak < p> tidak kosong, tidak bisa menutup sendiri. Di XHTML 1.1, itu bisa ditutup sendiri.Untuk menambah apa yang dikatakan oleh Brad dan skuadet, sintaksis self-closing XML
<script />
sebenarnya adalah XML yang benar, tetapi untuk itu dalam praktiknya, server web Anda juga perlu mengirim dokumen Anda sebagai XML yang dibentuk dengan benar dengan mimetype XML sepertiapplication/xhtml+xml
pada HTTP. Header Jenis-Konten (dan bukan sebagaitext/html
).Namun, mengirimkan mimetype XML akan menyebabkan halaman Anda tidak diuraikan oleh IE7, yang hanya disukai
text/html
.Dari w3 :
Saya bingung mengenai hal ini beberapa bulan yang lalu, dan satu-satunya solusi yang dapat dikerjakan (kompatibel dengan FF3 + dan IE7) adalah dengan menggunakan
<script></script>
sintaks lama dengantext/html
(sintaks HTML + mimetype HTML).Jika server Anda mengirim
text/html
jenis dalam tajuk HTTP, bahkan dengan dokumen XHTML yang dibentuk dengan benar, FF3 + akan menggunakan mode rendering HTML yang berarti<script />
tidak akan berfungsi (ini adalah perubahan, Firefox sebelumnya kurang ketat).Ini akan terjadi terlepas dari setiap mengutak-atik
http-equiv
elemen meta, prolog XML atau DOCTYPE di dalam dokumen Anda - cabang Firefox setelah mendapattext/html
header, yang menentukan apakah parser HTML atau XML terlihat di dalam dokumen, dan parser HTML tidak mengerti<script />
.sumber
.html
membuat file lokal dirender sebagai tag-sup terlepas dari meta tag, untuk alasan yang sama. Untuk file XHTML, Firefox hanya akan merendernya jika diberi nama.xhtml
.application/xhtml+xml
, bukantext/xml
.Jika ada yang penasaran, alasan utamanya adalah bahwa HTML pada awalnya adalah dialek SGML, yang merupakan kakak lelaki tua XML yang aneh. Dalam tanah SGML, elemen dapat ditentukan dalam DTD sebagai penutupan sendiri (misalnya BR, HR, INPUT), secara implisit dekat (mis. P, LI, TD), atau secara eksplisit dapat ditutup (misalnya TABLE, DIV, SCRIPT). XML, tentu saja, tidak memiliki konsep ini.
Pengurai tag-tag yang digunakan oleh peramban modern berkembang dari peninggalan ini, meskipun model penguraian mereka bukan lagi SGML murni. Dan tentu saja, XHTML Anda yang dibuat dengan hati-hati sedang diperlakukan sebagai sup tag-terinspirasi SGML yang ditulis dengan buruk kecuali jika Anda mengirimnya dengan tipe mime XML. Ini juga sebabnya ...
... ditafsirkan oleh browser sebagai:
... yang merupakan resep untuk bug tak dikenal yang indah yang dapat membuat Anda cocok saat Anda mencoba kode melawan DOM.
sumber
P
Elemen tidak dapat berisiDIV
elemen (ini adalah HTML tidak valid), sehingga browser secara implisit menutupP
elemen (didefinisikan sebagai "implisit dekat") sebelumDIV
tag pembuka . Namun, browser cenderung berperilaku berbeda dalam hal ini (seperti yang dapat mereka lakukan dengan HTML yang tidak valid).</p>
Tag akhir yang hilang di sisi lain sebenarnya adalah bagian dari definisi HTML!Yang lain telah menjawab "bagaimana" dan mengutip spec. Berikut adalah kisah nyata "mengapa tidak
<script/>
", setelah beberapa jam menggali laporan bug dan milis.HTML 4
HTML 4 didasarkan pada SGML .
SGML memiliki beberapa shorttags , seperti
<BR//
,<B>text</>
,<B/text/
, atau<OL<LI>item</LI</OL>
. XML mengambil bentuk pertama, mendefinisikan ulang akhiran sebagai ">" (SGML fleksibel), sehingga menjadi<BR/>
.Namun, HTML tidak didefinisikan ulang, jadi
<SCRIPT/>
harus berarti<SCRIPT>>
.(Ya, '>' harus menjadi bagian dari konten, dan tag masih belum ditutup.)
Jelas, ini tidak kompatibel dengan XHTML dan akan menghancurkan banyak situs (pada saat browser sudah cukup dewasa untuk peduli tentang ini ), jadi tidak ada yang menerapkan shorttag dan spesifikasi menyarankan untuk tidak melakukannya .
Secara efektif, semua tag tanpa akhir yang 'berfungsi' adalah tag dengan tag akhir yang dilarang pada parser yang secara teknis tidak sesuai dan pada kenyataannya tidak valid. Itu W3C yang datang dengan peretasan ini untuk membantu transisi ke XHTML dengan membuatnya kompatibel dengan HTML .
Dan
<script>
tag akhir tidak dilarang .Tag "Self-ending" adalah hack dalam HTML 4 dan tidak ada artinya.
HTML 5
HTML5 memiliki lima jenis tag dan hanya tag 'batal' dan 'asing' diizinkan untuk menutup sendiri .
Karena
<script>
tidak batal ( mungkin memiliki konten) dan tidak asing (seperti MathML atau SVG),<script>
tidak dapat ditutup sendiri, terlepas dari bagaimana Anda menggunakannya.Tapi kenapa? Tidak bisakah mereka menganggapnya sebagai benda asing, membuat kasus khusus, atau sesuatu?
HTML 5 bertujuan untuk kompatibel dengan implementasi HTML 4 dan XHTML 1. Ini tidak didasarkan pada SGML atau XML; sintaksinya terutama berkaitan dengan mendokumentasikan dan menyatukan implementasi. (Inilah sebabnya
<br/>
<hr/>
dll. Adalah HTML 5 yang valid meskipun HTML4 tidak valid.)Menutup diri
<script>
adalah salah satu tag di mana implementasi yang digunakan berbeda. Ini digunakan untuk bekerja di Chrome, Safari , dan Opera ; setahu saya itu tidak pernah bekerja di Internet Explorer atau Firefox.Ini dibahas ketika HTML 5 sedang dirancang dan ditolak karena itu merusak kompatibilitas browser . Laman web yang ditutup dengan tag skrip sendiri mungkin tidak ditampilkan dengan benar (jika ada) di peramban lama. Ada proposal lain , tetapi mereka juga tidak bisa menyelesaikan masalah kompatibilitas.
Setelah draft dirilis, WebKit memperbarui parser agar sesuai.
Menutup diri
<script>
tidak terjadi di HTML 5 karena kompatibilitas ke belakang ke HTML 4 dan XHTML 1.XHTML 1 / XHTML 5
Ketika benar-benar berfungsi sebagai XHTML,
<script/>
benar-benar tertutup, seperti yang dinyatakan oleh jawaban lain.Kecuali bahwa spesifikasi mengatakan itu seharusnya berfungsi ketika berfungsi sebagai HTML:
Jadi apa yang terjadi?
Orang-orang meminta Mozilla untuk membiarkan Firefox mem-parsing dokumen yang sesuai sebagai XHTML terlepas dari header konten yang ditentukan (dikenal sebagai sniffing konten ). Ini akan memungkinkan skrip penutup sendiri, dan penghirupan konten tetap diperlukan karena host web tidak cukup dewasa untuk melayani header yang benar; IE bagus dalam hal itu .
Jika perang browser pertama tidak berakhir dengan IE 6, XHTML mungkin sudah ada dalam daftar juga. Tapi itu memang berakhir. Dan IE 6 memiliki masalah dengan XHTML. Bahkan IE tidak mendukung jenis MIME yang benar sama sekali , memaksa semua orang untuk menggunakan
text/html
untuk XHTML karena IE diadakan pangsa pasar utama untuk seluruh dekade.Dan juga mengendus konten bisa sangat buruk dan orang-orang mengatakan itu harus dihentikan .
Akhirnya, ternyata W3C tidak berarti XHTML dapat dihirup : dokumen keduanya , HTML dan XHTML, dan
Content-Type
aturan. Bisa dikatakan mereka berdiri teguh pada "ikuti saja spec kami" dan mengabaikan apa yang praktis . Kesalahan yang berlanjut ke versi XHTML yang lebih baru.Bagaimanapun, keputusan ini menyelesaikan masalah untuk Firefox. Itu 7 tahun sebelum Chrome lahir ; tidak ada browser signifikan lainnya. Jadi diputuskan.
Menentukan doctype saja tidak memicu parsing XML karena spesifikasi berikut.
sumber
<p>
atau<li>
, tidak dapat 'ditutup sendiri' karena mereka dapat memiliki konten, jadi kode suka<p/>
tidak lebih dari tag yang memulai (salah bentuk) dan konten setelahnya, jika diizinkan dalam elemen ini , akan berakhir di dalamnya.Internet Explorer 8 dan yang lebih lama tidak mendukung penguraian XHTML. Bahkan jika Anda menggunakan deklarasi XML dan / atau XHTML doctype, IE lama masih mem-parsing dokumen sebagai HTML biasa. Dan dalam HTML biasa, sintaksis yang menutup sendiri tidak didukung. Garis miring trailing hanya diabaikan, Anda harus menggunakan tag penutup eksplisit.
Bahkan browser dengan dukungan untuk penguraian XHTML, seperti IE 9 dan yang lebih baru , akan tetap mem-parsing dokumen sebagai HTML kecuali jika Anda menyajikan dokumen dengan tipe konten XML. Tetapi dalam hal itu IE lama tidak akan menampilkan dokumen sama sekali!
sumber
Orang-orang di atas sudah cukup banyak menjelaskan masalah ini, tetapi satu hal yang mungkin membuat semuanya menjadi jelas adalah bahwa, meskipun orang menggunakan
<br/>
dan sepanjang waktu dalam dokumen HTML,/
pada posisi seperti itu pada dasarnya diabaikan, dan hanya digunakan ketika mencoba untuk membuat sesuatu yang keduanya dapat diuraikan sebagai XML dan HTML. Coba<p/>foo</p>
, misalnya, dan Anda mendapatkan paragraf reguler.sumber
Tag skrip penutup otomatis tidak berfungsi, karena tag skrip dapat berisi kode sebaris, dan HTML tidak cukup pintar untuk mengaktifkan atau menonaktifkan fitur tersebut berdasarkan keberadaan atribut.
Jika Anda ingin tag skrip tertutup sendiri, Anda tidak dapat melakukan itu seperti yang saya katakan, tetapi ada alternatifnya, meskipun bukan yang cerdas. Anda dapat menggunakan tag tautan penutup otomatis dan tautan ke JavaScript dengan memberikannya jenis teks / javascript dan rel sebagai skrip, seperti di bawah ini:
sumber
<style>
tag, namun menggunakan tag tautan untuk file CSS eksternal. Definisi tag tautan: " Tag <link> mendefinisikan tautan antara dokumen dan sumber daya eksternal." Tampak logis bahwa tag tautan akan digunakan untuk CSS eksternal atau JS ... itulah gunanya ... menghubungkan dalam file eksternal. perhatikan saya tidak berbicara spec / cross-browserness / etc, saya hanya mengomentari sifat logis menggunakan tag tautan untuk membawa baik CSS dan JS ... sebenarnya akan sangat masuk akal jika memang seperti itu . Tidak yakin sepatu [analogi] cocok.Tidak seperti XML dan XHTML, HTML tidak memiliki pengetahuan tentang sintaksis yang menutup sendiri. Browser yang menafsirkan XHTML sebagai HTML tidak tahu bahwa
/
karakter menunjukkan bahwa tag harus ditutup sendiri; alih-alih mereka menafsirkannya seperti atribut kosong dan parser masih menganggap tag itu 'terbuka'.Sama seperti
<script defer>
diperlakukan sebagai<script defer="defer">
,<script />
diperlakukan sebagai<script /="/">
.sumber
/
sebagai bagian dari konstruksi NET (Tag Akhir Null).Internet Explorer 8 dan yang lebih lama tidak mendukung tipe MIME yang tepat untuk XHTML
application/xhtml+xml
,. Jika Anda menjalankan XHTML sebagaitext/html
, yang harus Anda lakukan untuk versi Internet Explorer yang lebih lama untuk melakukan apa saja, itu akan ditafsirkan sebagai HTML 4.01. Anda hanya dapat menggunakan sintaks pendek dengan elemen apa pun yang memungkinkan tag penutup dihilangkan. Lihat Spesifikasi HTML 4.01 .XML 'short form' ditafsirkan sebagai atribut bernama /, yang (karena tidak ada tanda sama dengan) ditafsirkan memiliki nilai implisit "/". Ini benar-benar salah dalam HTML 4.01 - atribut yang tidak dideklarasikan tidak diizinkan - tetapi browser akan mengabaikannya.
IE9 dan kemudian mendukung XHTML 5 disajikan dengan
application/xhtml+xml
.sumber
Itu karena SCRIPT TAG bukan ELEMEN BISA.
Dalam Dokumen HTML - ELEMEN VOID tidak memerlukan "tag penutup" sama sekali!
Dalam xhtml , semuanya Generik, oleh karena itu mereka semua perlu terminasi misalnya "tag penutup"; Termasuk br, line-break sederhana,
<br></br>
atau steno -nya<br />
.Namun, Elemen Skrip tidak pernah menjadi Elemen batal atau parametrik, karena tag skrip sebelum hal lain, adalah Instruksi Browser, bukan deklarasi Deskripsi Data.
Pada prinsipnya, Instruksi Pengakhiran Semantik misalnya, "tag penutup" hanya diperlukan untuk memproses instruksi yang semantiknya tidak dapat diakhiri dengan tag berikutnya. Contohnya:
<H1>
semantik tidak dapat diakhiri dengan mengikuti<P>
karena ia tidak membawa cukup banyak semantiknya sendiri untuk mengesampingkan dan karenanya menghentikan set instruksi H1 sebelumnya. Meskipun akan dapat memecah aliran menjadi baris paragraf baru, itu tidak "cukup kuat" untuk mengesampingkan ukuran font saat ini & gaya-ketinggian garis mengalir ke sungai , yaitu bocor dari H1 (karena P tidak memilikinya ).Ini adalah bagaimana dan mengapa pensinyalan "/" (terminasi) telah ditemukan.
Tag terminasi tanpa-deskripsi umum seperti
< />
, akan mencukupi untuk setiap jatuh tunggal dari kaskade yang ditemui, misalnya:<H1>Title< />
tetapi itu tidak selalu terjadi, karena kami juga ingin dapat "bersarang", beberapa penandaan perantara dari Stream: split ke torrents sebelum membungkus / jatuh ke kaskade lain. Akibatnya terminator generik seperti< />
tidak akan dapat menentukan target properti untuk diakhiri. Sebagai contoh:<b>
bold<i>
bold-italic< />
italic</>
normal. Tidak diragukan lagi akan gagal untuk mendapatkan maksud kita dengan benar dan kemungkinan besar akan menafsirkannya sebagai huruf tebal- tebal yang normal.Ini adalah bagaimana gagasan pembungkus yaitu., Wadah lahir. (Gagasan ini sangat mirip sehingga tidak mungkin untuk membedakan dan kadang-kadang elemen yang sama memiliki keduanya.
<H1>
Keduanya adalah pembungkus dan wadah pada saat yang sama. Sedangkan<B>
hanya pembungkus semantik). Kita akan membutuhkan wadah polos, tidak ada semantik. Dan tentu saja penemuan Unsur DIV datang.Elemen DIV sebenarnya adalah 2BR-Container. Tentu saja kedatangan CSS membuat situasi lebih aneh daripada yang seharusnya dan menyebabkan kebingungan besar dengan banyak konsekuensi besar - secara tidak langsung!
Karena dengan CSS Anda dapat dengan mudah mengganti perilaku pra & setelah asli dari DIV yang baru ditemukan, sering disebut sebagai "wadah jangan lakukan apa-apa". Yang tentu saja salah! DIV adalah elemen blok dan akan secara alami memutus garis aliran baik sebelum dan sesudah pensinyalan akhir. Segera WEB mulai menderita halaman DIV-itis. Sebagian besar masih.
Datangnya CSS dengan kemampuannya untuk sepenuhnya menimpa dan sepenuhnya mendefinisikan kembali perilaku asli dari setiap Tag HTML, entah bagaimana berhasil membingungkan dan mengaburkan seluruh makna keberadaan HTML ...
Tiba-tiba semua tag HTML muncul seolah-olah usang, mereka rusak, dilucuti dari semua makna, identitas, dan tujuan aslinya. Entah bagaimana Anda akan mendapatkan kesan bahwa mereka tidak lagi diperlukan. Mengatakan: Satu tag pembungkus kontainer akan cukup untuk semua presentasi data. Cukup tambahkan atribut yang diperlukan. Mengapa tidak memiliki tag yang bermakna sebagai gantinya; Ciptakan nama tag saat Anda pergi dan biarkan CSS yang mengganggu.
Inilah bagaimana xhtml dilahirkan dan tentu saja tumpul besar, yang dibayar mahal oleh pendatang baru dan visi yang menyimpang tentang apa itu apa, dan apa tujuan utama dari semua itu. W3C pergi dari World Wide Web ke What Went Wrong, Kamerad? !!
Tujuan HTML adalah untuk mengalirkan data yang bermakna ke penerima manusia.
Untuk menyampaikan Informasi.
Bagian formal ada di sana hanya untuk membantu kejelasan pengiriman informasi. xhtml tidak memberikan sedikit pun pertimbangan untuk informasi tersebut. - Untuk itu, informasinya sama sekali tidak relevan.
Hal yang paling penting dalam masalah ini adalah untuk mengetahui dan dapat memahami bahwa xhtml bukan hanya versi dari beberapa HTML yang diperluas , xhtml adalah binatang yang sama sekali berbeda; alasan; dan karena itu bijaksana untuk memisahkan mereka.
sumber
Perbedaan antara 'true XHTML', 'faux XHTML' dan HTML serta pentingnya tipe MIME yang dikirim oleh server telah dijelaskan di sini dengan baik . Jika Anda ingin mencobanya sekarang, berikut ini cuplikan sederhana yang dapat diedit dengan pratinjau langsung termasuk tag skrip yang ditutup sendiri untuk peramban yang cakap:
Anda akan melihat
Hello, true XHTML. Nice to meet you!
teks di bawah ini.Untuk browser yang tidak mampu, Anda dapat menyalin konten textarea dan menyimpannya sebagai file dengan
.xhtml
(atau.xht
) ekstensi ( terima kasih Alek untuk petunjuk ini ).sumber
Jawaban sederhananya adalah karena tag dilambangkan sebagai wajib seperti itu
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script
sumber