</script>
harus dipecah karena jika tidak maka akan mengakhiri <script></script>
blok penutup terlalu dini. Benar-benar harus dibagi antara <
dan /
, karena blok skrip seharusnya (menurut SGML) diakhiri oleh setiap urutan tag-end terbuka (ETAGO) (yaitu </
) :
Meskipun elemen STYLE dan SCRIPT menggunakan CDATA untuk model datanya, untuk elemen-elemen ini, CDATA harus ditangani secara berbeda oleh agen pengguna. Markup dan entitas harus diperlakukan sebagai teks mentah dan diteruskan ke aplikasi apa adanya. Kemunculan pertama dari urutan karakter " </
" (pembatas tag terbuka-tag) diperlakukan sebagai pengakhiran akhir konten elemen. Dalam dokumen yang valid, ini akan menjadi tag akhir untuk elemen.
Namun dalam praktiknya browser hanya mengakhiri penguraian blok skrip CDATA pada </script>
tag- sebenarnya .
Di XHTML tidak ada penanganan khusus untuk blok skrip, sehingga setiap <
(atau &
) karakter di dalamnya harus &escaped;
seperti di elemen lain. Namun, browser yang mem-parsing XHTML sebagai HTML lama akan bingung. Ada beberapa solusi yang melibatkan blok CDATA, tetapi paling mudah untuk menghindari penggunaan karakter ini tanpa hambatan. Cara yang lebih baik untuk menulis elemen skrip dari skrip yang bekerja pada kedua jenis parser adalah:
<script type="text/javascript">
document.write('\x3Cscript type="text/javascript" src="foo.js">\x3C/script>');
</script>
\/
adalah urutan pelarian yang valid untuk/
, jadi mengapa tidak hanya menggunakan itu alih-alih string literal itu lolos<
? Misalnyadocument.write('<script src=foo.js><\/script>');
. Juga,</script>
bukan satu-satunya urutan karakter yang dapat menutup<script>
elemen. Beberapa info lebih lanjut di sini: mathiasbynens.be/notes/etago<\/script>
tidak masalah dalam hal ini, tetapi hanya akan berfungsi dalam HTML; di XHTML tanpa pembungkus bagian CDATA tambahan, itu masih merupakan kesalahan yang terjadi dengan baik. Anda juga dapat menggunakan\x3C
atribut inline event handler di mana<
juga tidak valid baik dalam HTML maupun XHTML, sehingga memiliki penerapan yang lebih luas: jika saya memilih satu, cara otomatis otomatis untuk menghindari karakter sensitif dalam literal string JS untuk semua konteks, itu yang saya pilih.<
dapat digunakan dalam atribut event handler inline. html5.validator.nu/... Dan Anda benar tentang kompatibilitas XHTML dari\x3C
sebuah sich, tetapi karena XHTML tidak mendukungdocument.write
(atauinnerHTML
), saya tidak melihat bagaimana itu relevan.document.write
tidak relevan, itu hanya contohnya. OP bisa menggunakan innerHTML, ini tentang menyembunyikan menyembunyikan</
urutan karakter dari parser markup, di mana pun itu terjadi. Hanya saja sebagian besar parser membiarkannya di dalam elemen skrip padahal sebenarnya tidak seharusnya (tetapi parser HTML sangat toleran). Anda benar bahwa<\/
cukup dalam semua kasus untuk HTML.document.write('<script src="foo.js">\x3C/script>')
tampaknya sudah cukup di semua browser kembali ke IE6. (Saya meninggalkan atribut type karena itu tidak diperlukan dalam HTML5, juga tidak ditegakkan seperti yang disyaratkan oleh browser apa pun.)Berikut variasi lain yang telah saya gunakan ketika ingin membuat inline tag skrip (jadi langsung dieksekusi) tanpa perlu bentuk apa pun:
(Catatan: bertentangan dengan sebagian besar contoh di internet, saya tidak mengatur
type="text/javascript"
tag terlampir, maupun yang dibuat: tidak ada browser yang tidak memiliki itu sebagai default, dan karena itu berlebihan, tetapi tidak ada salahnya juga, jika Anda tidak setuju).sumber
Saya pikir ini untuk mencegah parser HTML peramban dari menafsirkan <script>, dan terutama </script> sebagai tag penutup skrip aktual, namun saya tidak berpikir bahwa menggunakan document.write adalah ide bagus untuk mengevaluasi skrip blok, mengapa tidak menggunakan DOM ...
sumber
Solusi yang diposting Bobince bekerja dengan sempurna untuk saya. Saya ingin menawarkan metode alternatif juga untuk pengunjung masa depan:
Dalam contoh ini, saya telah menyertakan pemuatan bersyarat untuk jQuery untuk menunjukkan use case. Semoga bermanfaat bagi seseorang!
sumber
Bagian
</script>
dalam string Javascript diinterpretasi oleh parser HTML sebagai tag penutup, menyebabkan perilaku yang tidak terduga ( lihat contoh di JSFiddle ).Untuk menghindari ini, Anda dapat menempatkan javascript di antara komentar (gaya pengkodean ini adalah praktik umum, ketika Javascript kurang didukung di antara browser). Ini akan berhasil ( lihat contoh di JSFiddle ):
... tapi jujur saja, menggunakan
document.write
bukanlah sesuatu yang saya anggap sebagai praktik terbaik. Mengapa tidak memanipulasi DOM secara langsung?sumber
append
bukanappendChild
. Memperbaiki jawabannya. Terima kasih telah memperhatikan!