Pertanyaan Mengapa tag script penutupan otomatis tidak berfungsi?


Apa alasan browser tidak mengenali dengan benar:

<script src="foobar.js" /> <!-- self-closing script tag -->

Hanya ini yang diakui:

<script src="foobar.js"></script>

Apakah ini melanggar konsep dukungan XHTML?

Catatan: Pernyataan ini benar setidaknya untuk semua IE (6-8 beta 2).


1155
2017-09-16 06:52


asal


Jawaban:


Spesifikasi XHTML 1 mengatakan:

С.3. Elemen Minimalisasi dan Konten Elemen Kosong

Diberikan contoh kosong dari elemen yang model kontennya tidak EMPTY (misalnya, judul atau paragraf kosong) tidak menggunakan formulir yang diminimalkan (misalnya, gunakan <p> </p> dan tidak <p />).

XHTML DTD menentukan tag skrip sebagai:

<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>

419
2017-09-16 07:08



Untuk menambah apa yang dikatakan Brad dan squadette, sintaks XML yang menutup diri <script /> sebenarnya aku s XML yang benar, tetapi untuk berfungsi dalam praktek, server web Anda juga perlu mengirim dokumen Anda sebagai XML yang terbentuk dengan baik dengan mimetype XML seperti application/xhtml+xml di header Tipe Konten HTTP (dan tidak sebagai text/html).

Namun, mengirimkan mimetype XML akan menyebabkan halaman Anda tidak diurai oleh IE7, yang hanya suka text/html.

Dari w3:

Singkatnya, 'aplikasi / xhtml + xml'   SEHARUSNYA digunakan untuk Keluarga XHTML   dokumen, dan penggunaan 'teks / html'   HARUS dibatasi ke HTML-kompatibel   Dokumen XHTML 1.0. 'aplikasi / xml'   dan 'teks / xml' DAPAT juga digunakan, tapi   kapanpun sesuai,   'application / xhtml + xml' SEHARUSNYA digunakan   daripada mereka XML media yang umum   jenis.

Saya bingung tentang ini beberapa bulan yang lalu, dan satu-satunya solusi yang bisa diterapkan (kompatibel dengan FF3 + dan IE7) adalah menggunakan yang lama <script></script> sintaks dengan text/html (HTML syntax + HTML mimetype).

Jika server Anda mengirim text/html ketik header HTTP-nya, bahkan dengan dokumen XHTML yang terbentuk dengan benar, FF3 + akan menggunakan mode rendering HTML-nya yang berarti bahwa <script /> tidak akan berfungsi (ini adalah perubahan, Firefox sebelumnya kurang ketat).

Ini akan terjadi tanpa menghiraukan apapun http-equiv meta tags, XML prolog atau doctype di dalam dokumen Anda - cabang Firefox setelah mendapat text/html header, yang menentukan apakah pengurai HTML atau XML terlihat di dalam dokumen, dan parser HTML tidak mengerti <script />.


211
2017-09-16 08:14



Jika ada yang penasaran, alasan utamanya adalah bahwa HTML pada mulanya adalah dialek SGML, yang merupakan kakak aneh XML. Di tanah SGML, tag dapat ditentukan dalam DTD sebagai penutupan sendiri (misalnya, BR, HR, INPUT), secara implisit dapat ditutup (mis. P, LI, TD), atau secara eksplisit dapat ditutup (misalnya, TABEL, DIV, SCRIPT). XML tentu saja tidak memiliki konsep ini.

Pars-pars tag-sup yang digunakan oleh peramban modern berevolusi dari warisan ini, meskipun model parsing mereka tidak murni SGML lagi. Dan tentu saja XHTML Anda yang dibuat dengan hati-hati sedang diperlakukan sebagai sup tag yang terinspirasi SGML kecuali Anda mengirimkannya dengan tipe mime XML. Ini juga alasannya ...

<p><div>hello</div></p>

... ditafsirkan oleh peramban sebagai:

<p></p><div>hello</div><p></p>

... yang merupakan resep untuk bug tidak jelas yang indah yang dapat melemparkan Anda ke dalam fit ketika Anda mencoba untuk mengkodekan DOM.


140
2017-07-25 02:52



Orang lain telah menjawab "bagaimana" dan mengutip spesifikasi. Inilah kisah nyata dari "mengapa tidak <script/>", setelah beberapa jam menggali laporan bug dan milis.


HTML 4

HTML 4 didasarkan pada SGML.

SGML punya beberapa shorttags, seperti <BR//, <B>text</>, <B/text/, atau <OL<LI>item</LI</OL>. XML mengambil bentuk pertama, mengubah akhir sebagai ">" (SGML fleksibel), sehingga menjadi <BR/>.

Namun, HTML tidak melakukan redfine, jadi <SCRIPT/>  harus berarti  <SCRIPT>>.
(Ya, '>' harus menjadi bagian dari konten, dan tag itu tetap tidak Tutup.)

Tentunya, ini tidak kompatibel dengan XHTML dan akan menghancurkan banyak situs (oleh browser waktu cukup dewasa menjaga  tentang ini), jadi tidak ada yang menerapkan shorttags dan spesifikasi menasihati mereka.

Secara efektif, semua tag self-ended 'yang berfungsi' adalah tag dengan tag akhir opsional pada parser yang secara teknis tidak sesuai dan pada kenyataannya tidak valid. Itu W3C yang mana muncul dengan peretasan ini untuk membantu transisi ke XHTML dengan membuatnya Kompatibel dengan HTML.

Dan <script>tag akhir adalah tidak opsional.

Tag "Mandiri" adalah peretasan dalam HTML 4 dan tidak ada artinya.


HTML 5

HTML5 memiliki lima jenis tag dan hanya tag 'kosong' dan 'asing' diizinkan untuk menutup diri.

Karena <script> tidak batal (itu mungkin memiliki konten) dan tidak asing (seperti MathML atau SVG), <script> tidak dapat ditutup sendiri, terlepas dari cara Anda menggunakannya.

Tapi kenapa? Tidak bisakah mereka menganggapnya sebagai asing, membuat kasus khusus, atau sesuatu?

HTML 5 bertujuan untuk menjadi kompatibel mundur dengan implementasi HTML 4 dan XHTML 1. Ini tidak berdasarkan SGML atau XML; sintaksnya terutama berkaitan dengan mendokumentasikan dan menyatukan implementasi. (Ini sebabnya <br/>  <hr/> dll HTML yang valid 5 meskipun HTML4 tidak valid.)

Penutup sendiri <script> adalah salah satu tag di mana implementasi yang digunakan berbeda. Saya t dulu bekerja di Chrome, Safari, dan Opera; setahu saya itu tidak pernah bekerja di Internet Explorer atau Firefox.

Ini sudah dibahas ketika HTML 5 sedang disusun dan ditolak karena itu istirahat  browser  kesesuaian. Laman web yang tag skrip menutup sendiri mungkin tidak ditampilkan dengan benar (jika ada) di peramban lama. Ada proposal lainnya, tetapi mereka tidak bisa menyelesaikan masalah kompatibilitas baik.

Setelah draft dirilis, WebKit memperbarui parser agar sesuai.

Penutup sendiri <script> tidak terjadi dalam HTML 5 karena kompatibilitas ke HTML 4 dan XHTML 1.


XHTML 1 / XHTML 5

Kapan sangat disajikan sebagai XHTML, <script/> benar-benar tertutup, seperti jawaban lainnya telah menyatakan.

Kecuali itu spek mengatakan saya t harus telah berfungsi saat disajikan sebagai HTML:

Dokumen XHTML ... dapat diberi label dengan Jenis Media Internet "text / html" [RFC2854], karena kompatibel dengan sebagian besar peramban HTML.

Jadi apa yang terjadi?

Orang-orang tanya Mozilla untuk biarkan Firefox mengurai menyesuaikan dokumen sebagai XHTML terlepas dari header konten yang ditentukan (dikenal sebagai konten mengendus). Ini akan memungkinkan skrip penutupan diri, dan konten mengendus itu diperlukan juga karena web hoster tidak cukup matang untuk melayani header yang benar; Yaitu bagus dalam hal itu.

Jika itu perang browser pertama tidak berakhir dengan IE 6, XHTML mungkin ada di daftar, juga. Tapi itu berakhir. Dan IE 6 punya masalah dengan XHTML. Bahkan IE tidak mendukung tipe MIME yang benar sama sekali, memaksa semua orang menggunakan text/html untuk XHTML karena IE memiliki pangsa pasar besar selama satu dekade penuh.

Dan juga konten mengendus dapat  sangat buruk dan orang-orang berkata itu harus dihentikan.

Akhirnya, ternyata W3C tidak berarti XHTML dapat diendus: dokumen itu kedua, HTML dan XHTML, dan Content-Type aturan. Satu dapat mengatakan mereka berdiri teguh "hanya mengikuti spesifikasi kami" dan mengabaikan apa yang praktis. Kesalahan itu lanjut ke versi XHTML berikutnya.

Pokoknya, keputusan ini menyelesaikan masalah untuk Firefox. Itu 7 tahun sebelum Chrome lahir; tidak ada peramban penting lainnya. Dengan demikian diputuskan.

Menentukan doctype saja tidak memicu penguraian XML karena spesifikasi berikut.


123
2018-02-25 12:37



Internet Explorer 8 dan sebelumnya tidak mendukung penguraian XHTML. Bahkan jika Anda menggunakan deklarasi XML dan / atau doctype XHTML, IE lama masih mengurai dokumen sebagai HTML biasa. Dan dalam HTML biasa, syntax self-closing tidak didukung. Garis miring di belakang hanya diabaikan, Anda harus menggunakan tag penutup eksplisit.

Bahkan browser dengan dukungan untuk parsing XHTML, seperti IE 9 dan yang lebih baru, masih akan mengurai dokumen sebagai HTML kecuali Anda melayani dokumen dengan tipe konten XML. Namun dalam hal itu IE lama tidak akan menampilkan dokumen sama sekali!


43
2017-09-16 08:00



Orang-orang di atas sudah cukup banyak menjelaskan masalah ini, tetapi satu hal yang mungkin membuat semuanya menjadi jelas adalah bahwa, meskipun orang menggunakan '&lt;br/>' dan seperti itu sepanjang waktu HTML dokumen, apapun '/' dalam posisi seperti itu pada dasarnya diabaikan, dan hanya digunakan ketika mencoba membuat sesuatu yang dapat diuraikan sebagai XML dan HTML. Mencoba '&lt;p/>foo&lt;/p>', misalnya, dan Anda mendapat paragraf reguler.


25
2017-09-16 13:07



Tag script menutup diri tidak akan berfungsi, karena tag skrip dapat berisi kode inline, dan HTML tidak cukup pintar untuk mengaktifkan atau menonaktifkan fitur tersebut berdasarkan keberadaan atribut.

Di sisi lain, HTML memang memiliki tag yang sangat baik untuk disertakan   referensi ke sumber luar: <link>tag, dan itu bisa   menutup diri. Ini sudah digunakan untuk memasukkan stylesheet, RSS, dan Atom   umpan, URI kanonis, dan segala jenis barang lainnya. Kenapa tidak   JavaScript?

Jika Anda ingin tag skrip tertutup sendiri, Anda tidak dapat melakukannya seperti yang saya katakan, tetapi ada alternatif, meskipun bukan yang cerdas. Anda dapat menggunakan tag tautan penutupan diri dan tautan ke JavaScript Anda dengan memberinya jenis teks / javascript dan rel sebagai skrip, sesuatu seperti di bawah ini:

<link type="text/javascript" rel ="script" href="/path/tp/javascript" />

23
2017-10-27 09:35



Tidak seperti XML dan XHTML, HTML tidak memiliki pengetahuan tentang sintaks self-closing. Browser yang menafsirkan XHTML sebagai HTML tidak tahu bahwa / karakter menunjukkan bahwa tag harus menutup 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 /="/">.


19
2017-09-16 07:10



Internet Explorer 8 dan yang lebih lama tidak mendukung tipe MIME yang tepat untuk XHTML, application/xhtml+xml. Jika Anda melayani XHTML sebagai text/html, yang harus Anda gunakan untuk versi Internet Explorer yang lebih lama untuk melakukan apa pun, itu akan ditafsirkan sebagai HTML 4.01. Anda hanya dapat menggunakan sintaks singkat dengan elemen apa pun yang memungkinkan tag penutup dihapus. Lihat Spesifikasi HTML 4.01.

'Bentuk singkat' XML 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 diumumkan tidak diizinkan - tetapi browser akan mengabaikannya.

IE9 dan yang lebih baru mendukung XHTML 5 disajikan dengan application/xhtml+xml.


18
2017-09-16 12:48



Perbedaan antara 'true XHTML', 'faux XHTML' dan HTML serta pentingnya jenis MIME yang dikirim oleh server telah sudah 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 browser yang mampu:

div { display: flex; }
div + div {flex-direction: column; }
<div>Mime type: <label><input type="radio" onchange="t.onkeyup()" id="x" checked  name="mime"> application/xhtml+xml</label>
<label><input type="radio" onchange="t.onkeyup()" name="mime"> text/html</label></div>
<div><textarea id="t" rows="4" 
onkeyup="i.src='data:'+(x.checked?'application/xhtml+xml':'text/html')+','+encodeURIComponent(t.value)"
><?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
[<!ENTITY x "true XHTML">]>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
  <p>
    <span id="greet" swapto="Hello">Hell, NO :(</span> &x;.
    <script src="data:text/javascript,(g=document.getElementById('greet')).innerText=g.getAttribute('swapto')" />
    Nice to meet you!
    <!-- 
      Previous text node and all further content falls into SCRIPT element content in text/html mode, so is not rendered. Because no end script tag is found, no script runs in text/html
    -->
  </p>
</body>
</html></textarea>

<iframe id="i" height="80"></iframe>

<script>t.onkeyup()</script>
</div>

Anda harus melihat Hello, true XHTML. Nice to meet you! di bawah textarea.

Untuk browser yang tidak dapat digunakan, Anda dapat menyalin konten dari textarea dan menyimpannya sebagai file .xhtml (atau .xht) ekstensi (terima kasih Alek untuk petunjuk ini).


3
2017-11-22 00:25