Adakah gagasan mengapa potongan kode di bawah ini tidak menambahkan elemen skrip ke DOM?
var code = "<script></script>";
$("#someElement").append(code);
javascript
jquery
Dan Burzo
sumber
sumber
Jawaban:
Saya telah melihat masalah di mana beberapa browser tidak menghargai beberapa perubahan ketika Anda melakukannya secara langsung (maksud saya membuat HTML dari teks seperti Anda mencoba dengan tag skrip), tetapi ketika Anda melakukannya dengan perintah bawaan segalanya menjadi lebih baik. Coba ini:
Dari: JSON untuk jQuery
sumber
script.type
tidak perlu.$("#someElement")[0].appendChild( script );
Kabar Baik adalah:
Ini 100% berfungsi.
Cukup tambahkan sesuatu di dalam tag skrip seperti
alert('voila!');
. Pertanyaan yang tepat yang mungkin ingin Anda tanyakan, "Mengapa saya tidak melihatnya di DOM?" .Karl Swedberg telah membuat penjelasan yang bagus untuk komentar pengunjung di situs API jQuery . Saya
tidakingin mengulangi semua kata-katanya, Anda dapat membaca langsung disana disini (saya merasa sulit untuk menavigasi melalui komentar di sana) .Hal berikutnya adalah, saya akan meringkas apa kabar buruk dengan menggunakan
.append()
fungsi untuk menambahkan skrip.Dan Berita Buruknya adalah ..
Anda tidak dapat men-debug kode Anda.
Saya tidak bercanda, bahkan jika Anda menambahkan
debugger;
kata kunci di antara baris yang ingin Anda tetapkan sebagai breakpoint, Anda hanya akan mendapatkan tumpukan panggilan objek tanpa melihat breakpoint pada kode sumber, (belum lagi bahwa ini kata kunci hanya berfungsi di peramban webkit, semua peramban utama lainnya sepertinya mengabaikan kata kunci ini) .Jika Anda sepenuhnya memahami apa yang kode Anda lakukan, maka ini akan menjadi kelemahan kecil. Tetapi jika tidak, Anda akhirnya akan menambahkan
debugger;
kata kunci di semua tempat hanya untuk mengetahui apa yang salah dengan kode Anda (atau saya). Lagi pula, ada alternatif, jangan lupa bahwa javascript dapat memanipulasi HTML DOM secara asli.Penanganan masalah.
Gunakan javascript (bukan jQuery) untuk memanipulasi HTML DOM
Jika Anda tidak ingin kehilangan kemampuan debug, Anda dapat menggunakan manipulasi DOM HTML asli javascript. Pertimbangkan contoh ini:
Itu dia, sama seperti masa lalu bukan. Dan jangan lupa untuk membersihkan semuanya baik di DOM atau di memori untuk semua objek yang direferensikan dan tidak diperlukan lagi untuk mencegah kebocoran memori. Anda dapat mempertimbangkan kode ini untuk membersihkan:
Kelemahan dari pemecahan masalah ini adalah Anda mungkin secara tidak sengaja menambahkan skrip duplikat, dan itu buruk. Dari sini Anda dapat sedikit meniru
.append()
fungsi dengan menambahkan verifikasi objek sebelum menambahkan, dan menghapus skrip dari DOM tepat setelah ditambahkan. Pertimbangkan contoh ini:Dengan cara ini, Anda dapat menambahkan skrip dengan kemampuan debugging sementara aman dari duplikasi skrip. Ini hanya prototipe, Anda dapat memperluas apa pun yang Anda inginkan. Saya telah menggunakan pendekatan ini dan cukup puas dengan ini. Cukup yakin saya tidak akan pernah menggunakan jQuery
.append()
untuk menambahkan skrip.sumber
$.getScript
dibangun ke dalam jQuery.Dimungkinkan untuk memuat file JavaScript secara dinamis menggunakan fungsi jQuery
getScript
Sekarang skrip eksternal akan dipanggil, dan jika tidak dapat dimuat, skrip tersebut akan diturunkan dengan anggun.
sumber
eval()
.Apa maksudmu "tidak bekerja"?
jQuery mendeteksi bahwa Anda mencoba membuat elemen SCRIPT dan secara otomatis akan menjalankan konten elemen dalam konteks global. Apakah Anda mengatakan kepada saya bahwa ini tidak berhasil untuk Anda? -
Sunting: Jika Anda tidak melihat elemen SCRIPT di DOM (di Firebug misalnya) setelah Anda menjalankan perintah itu karena jQuery, seperti yang saya katakan, akan menjalankan kode dan kemudian akan menghapus elemen SCRIPT - Saya percaya bahwa elemen SCRIPT selalu ditambahkan ke badan ... tapi bagaimanapun - penempatan sama sekali tidak ada kaitannya dengan eksekusi kode dalam situasi ini.
sumber
Ini bekerja:
Sepertinya jQuery melakukan sesuatu yang pintar dengan skrip sehingga Anda perlu menambahkan elemen html daripada objek jQuery.
sumber
Coba ini semoga bermanfaat:
sumber
Saya ingin melakukan hal yang sama tetapi menambahkan tag skrip di bingkai lain!
sumber
Dalam
</script>
string literal mengakhiri seluruh skrip, untuk menghindari hal itu"</scr" + "ipt>"
dapat digunakan sebagai gantinya.sumber
"\x3cscript\x3e\x3c/script\x3e"
. Di XHTML, Anda hanya perlu memasukkan blok CDATA yang sudah dikomentari.</
tidak diizinkan. Lihat stackoverflow.com/questions/236073/...Menambahkan sourceURL dalam file skrip membantu seperti yang disebutkan di halaman ini: https://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/
sumber
Script Anda sedang dieksekusi, Anda tidak bisa menggunakannya
document.write
. Gunakan lansiran untuk mengujinya dan menghindari penggunaandocument.write
. Pernyataan file js Anda dengandocument.write
tidak akan dieksekusi dan sisa fungsi akan dieksekusi.sumber
Inilah yang saya pikir merupakan solusi terbaik. Google Analytics disuntikkan dengan cara ini.
sumber
Anda tidak perlu jQuery untuk membuat Elemen DOM Script . Ini dapat dilakukan dengan vanilla ES6 seperti:
Itu tidak perlu dibungkus dengan
Promise
, tetapi dengan melakukan hal itu Anda dapat menyelesaikan janji ketika skrip dimuat, membantu mencegah kondisi balapan untuk skrip yang sudah berjalan lama.sumber
Tambahkan skrip ke badan:
sumber
Cara lain yang dapat Anda lakukan jika Anda ingin menambahkan kode menggunakan
document.createElement
metode tetapi kemudian menggunakan.innerHTML
alih-alih.src
.sumber
Saya mencoba ini satu dan bekerja dengan baik. Cukup ganti
<
simbolnya dengan itu\x3C
.atau
Anda dapat menguji kodenya di sini .
sumber
Bisa coba seperti ini
Satu-satunya alasan Anda tidak dapat melakukannya
"<script></script>"
adalah karena string tidak diizinkan di dalam javascript karena lapisan DOM tidak dapat menguraikan apa js dan apa itu HTML.sumber
Saya menulis sebuah
npm
paket yang memungkinkan Anda mengambil string HTML, termasuk tag skrip dan menambahkannya ke sebuah wadah saat menjalankan skripContoh:
Temukan di sini: https://www.npmjs.com/package/appendhtml
sumber
Cukup buat elemen dengan menguraikannya dengan jQuery.
Contoh kerja: https://plnkr.co/edit/V2FE28Q2eBrJoJ6PUEBz
sumber