Saya secara dinamis menambahkan <script>
tag ke halaman <head>
, dan saya ingin mengetahui apakah pemuatan gagal dalam beberapa cara - 404, kesalahan skrip dalam skrip yang dimuat, apa pun.
Di Firefox, ini berfungsi:
var script_tag = document.createElement('script');
script_tag.setAttribute('type', 'text/javascript');
script_tag.setAttribute('src', 'http://fail.org/nonexistant.js');
script_tag.onerror = function() { alert("Loading failed!"); }
document.getElementsByTagName('head')[0].appendChild(script_tag);
Namun, ini tidak berfungsi di IE atau Safari.
Adakah yang tahu cara untuk membuat ini berfungsi di browser selain Firefox?
(Menurut saya solusi yang tidak memerlukan penempatan kode khusus dalam file .js adalah solusi yang bagus. Ini tidak elegan dan tidak fleksibel.)
javascript
onerror
script-tag
David
sumber
sumber
if
+ polling adalah hal yang menjengkelkan yang tidak ingin saya masukkan ke semua JS.Jawaban:
Tidak ada peristiwa kesalahan untuk tag skrip. Anda dapat mengetahui kapan itu berhasil, dan berasumsi bahwa itu belum dimuat setelah waktu tunggu:
sumber
Jika Anda hanya peduli dengan browser html5 Anda dapat menggunakan peristiwa kesalahan (karena ini hanya untuk penanganan kesalahan, sebaiknya hanya mendukung ini di browser generasi berikutnya untuk KISS IMHO).
Dari spesifikasi:
~
Ini berarti Anda tidak perlu melakukan polling yang rawan error dan dapat menggabungkannya dengan atribut async dan defer untuk memastikan skrip tidak memblokir rendering halaman:
Selengkapnya tentang http://www.w3.org/TR/html5/scripting-1.html#script
sumber
<script src="nonexistent.js" onerror="alert('error!')"></script>
biolaUncaught SyntaxError: Unexpected token '<'
(di Chrome terbaru)<script src="nonexistent.js" onerror="alert('error!')"></script>
harus masuk ke file HTML Anda, bukan JS.Skrip dari Erwinus berfungsi dengan baik, tetapi tidak dikodekan dengan sangat jelas. Saya mengambil kebebasan untuk membersihkannya dan menguraikan apa yang dilakukannya. Saya telah membuat perubahan ini:
prototype
.require()
menggunakan variabel argumenalert()
pesan yang dikembalikan secara defaultTerima kasih sekali lagi kepada Erwinus, fungsinya sendiri sangat tepat.
sumber
solusi bersih kerja saya (2017)
Seperti yang Martin tunjukkan, digunakan seperti itu:
ATAU
sumber
loaderScript("myscript.js").then(() => { console.log("loaded"); }).catch(() => { console.log("error"); });
Saya tahu ini adalah utas lama tetapi saya punya solusi yang bagus untuk Anda (menurut saya). Ini disalin dari kelas saya, yang menangani semua hal AJAX.
Ketika skrip tidak dapat dimuat, itu mengatur penangan kesalahan tetapi ketika penangan kesalahan tidak didukung, itu kembali ke pengatur waktu yang memeriksa kesalahan selama 15 detik.
sumber
Untuk memeriksa apakah javascript yang
nonexistant.js
dikembalikan tidak ada kesalahan, Anda harus menambahkan variabel di dalamhttp://fail.org/nonexistant.js
likevar isExecuted = true;
dan kemudian memeriksa apakah ada saat tag skrip dimuat.Namun jika Anda hanya ingin memeriksa bahwa yang
nonexistant.js
dikembalikan tanpa 404 (artinya ada), Anda dapat mencoba denganisLoaded
variabel ...Ini akan mencakup kedua kasus tersebut.
sumber
Saya harap ini tidak diturunkan suara, karena dalam keadaan khusus ini adalah cara paling andal untuk menyelesaikan masalah. Kapan pun server mengizinkan Anda untuk mendapatkan sumber daya Javascript menggunakan CORS ( http://en.wikipedia.org/wiki/Cross-origin_resource_sharing ), Anda memiliki beragam opsi untuk melakukannya.
Menggunakan XMLHttpRequest untuk mengambil sumber daya akan berfungsi di semua browser modern, termasuk IE. Karena Anda ingin memuat Javascript, Anda memiliki Javascript yang tersedia untuk Anda sejak awal. Anda dapat melacak kemajuan menggunakan readyState ( http://en.wikipedia.org/wiki/XMLHttpRequest#The_onreadystatechange_event_listener ). Terakhir, setelah Anda menerima konten file, Anda dapat menjalankannya dengan eval (). Ya, saya katakan eval - karena dari segi keamanan tidak ada bedanya dengan memuat skrip secara normal. Faktanya, teknik serupa disarankan oleh John Resig untuk memiliki tag yang lebih bagus ( http://ejohn.org/blog/degrading-script-tags/ ).
Metode ini juga memungkinkan Anda memisahkan pemuatan dari eval, dan menjalankan fungsi sebelum dan sesudah eval terjadi. Ini menjadi sangat berguna saat memuat skrip secara paralel tetapi mengevaluasinya satu demi satu - sesuatu yang dapat dilakukan browser dengan mudah saat Anda menempatkan tag di HTML, tetapi jangan biarkan Anda dengan menambahkan skrip pada waktu proses dengan Javascript.
CORS juga lebih disukai daripada JSONP untuk memuat skrip ( http://en.wikipedia.org/wiki/XMLHttpRequest#Cross-domain_requests ). Namun, jika Anda mengembangkan widget pihak ketiga Anda sendiri untuk disematkan di situs lain, Anda seharusnya memuat file Javascript dari domain Anda sendiri di iframe Anda sendiri (sekali lagi, menggunakan AJAX)
Pendeknya:
Coba lihat apakah Anda dapat memuat sumber daya menggunakan AJAX GET
Gunakan eval setelah berhasil dimuat
Untuk memperbaikinya:
Lihat header kontrol-cache yang sedang dikirim
Periksa jika tidak, caching konten di localStorage, jika Anda perlu
Lihat "menurunkan javascript" Resig untuk kode yang lebih bersih
Lihat require.js
sumber
Trik ini berhasil untuk saya, meskipun saya akui bahwa ini mungkin bukan cara terbaik untuk menyelesaikan masalah ini. Alih-alih mencoba ini, Anda harus melihat mengapa javascript tidak dimuat. Coba simpan salinan lokal skrip di server Anda, dll. Atau tanyakan kepada vendor pihak ketiga tempat Anda mencoba mengunduh skrip.
Jadi, inilah solusinya: 1) Inisialisasi variabel ke false 2) Setel ke true saat javascript dimuat (menggunakan atribut onload) 3) periksa apakah variabel benar atau salah setelah badan HTML dimuat
sumber
Berikut adalah solusi berbasis JQuery lain tanpa timer:
Terima kasih kepada: https://stackoverflow.com/a/14691735/1243926
Contoh penggunaan (contoh asli dari dokumentasi getScript JQuery ):
sumber
cache:true
untuk panggilan $ .getScript (ini dinonaktifkan secara default). Dengan cara ini, untuk sebagian besar permintaan, secara otomatis menggunakan versi cache untuk panggilan getScript (menghemat latensi Anda)Ini dapat dilakukan dengan aman menggunakan promise
dan gunakan seperti ini
sumber
Alasan tidak berfungsi di Safari adalah karena Anda menggunakan sintaks atribut. Ini akan bekerja dengan baik:
... kecuali di IE.
Jika Anda ingin memeriksa skrip berhasil dieksekusi, cukup setel variabel menggunakan skrip itu dan periksa apakah sudah disetel di kode luar.
sumber
<script>
. Jika Anda mencoba menambahkannya sebelumnya, Anda mendapatkan pesan kesalahan bahwa tag tidak ada, dan jika Anda menambahkannya setelahnya maka skrip sudah berjalan dan memicu kejadiannya. Satu-satunya cara adalah mencari efek samping yang disebabkan oleh skrip.Acara onerror
* Perbarui Agustus 2017: onerror diaktifkan oleh Chrome dan Firefox. onload dipicu oleh Internet Explorer. Edge tidak mengaktifkan onerror maupun onload. Saya tidak akan menggunakan metode ini tetapi dapat berhasil dalam beberapa kasus. Lihat juga
<link> onerror tidak berfungsi di IE
*
Definisi dan Penggunaan Acara onerror dipicu jika terjadi kesalahan saat memuat file eksternal (mis. Dokumen atau gambar).
Tip: Saat digunakan pada media audio / video, kejadian terkait yang terjadi ketika ada gangguan pada proses pemuatan media, adalah:
Dalam HTML:
elemen onerror = "myScript">
Di JavaScript , menggunakan metode addEventListener ():
object.addEventListener ("error", myScript);
Catatan: Metode addEventListener () tidak didukung di Internet Explorer 8 dan versi sebelumnya.
Contoh Jalankan JavaScript jika terjadi kesalahan saat memuat gambar:
img src = "image.gif" onerror = "myFunction ()">
sumber
Diusulkan untuk menetapkan batas waktu dan kemudian mengasumsikan kegagalan pemuatan setelah batas waktu.
Masalah dengan pendekatan itu adalah bahwa asumsi tersebut didasarkan pada kebetulan. Setelah waktu tunggu Anda kedaluwarsa, permintaan masih menunggu keputusan. Permintaan untuk skrip yang tertunda dapat dimuat, bahkan setelah programmer berasumsi bahwa pemuatan tidak akan terjadi.
Jika permintaan bisa dibatalkan, maka program bisa menunggu beberapa saat, lalu membatalkan permintaan tersebut.
sumber
Beginilah cara saya menggunakan janji untuk mendeteksi kesalahan pemuatan yang dipancarkan pada objek jendela:
sumber
Nah, satu-satunya cara yang bisa saya pikirkan untuk melakukan semua yang Anda inginkan sangat buruk. Pertama lakukan panggilan AJAX untuk mengambil konten file Javascript. Ketika ini selesai, Anda dapat memeriksa kode status untuk memutuskan apakah ini berhasil atau tidak. Kemudian ambil responseText dari objek xhr dan bungkus dalam try / catch, buat tag skrip secara dinamis, dan untuk IE Anda dapat mengatur properti teks dari tag skrip ke teks JS, di semua browser lain Anda seharusnya dapat melakukannya menambahkan node teks dengan konten ke tag script. Jika ada kode yang mengharapkan tag skrip untuk benar-benar berisi lokasi src dari file tersebut, ini tidak akan berfungsi, tetapi seharusnya baik-baik saja untuk sebagian besar situasi.
sumber