mata teras
onerror
crossorigin="anonymous"
. window.onerror
try/catch
, anda boleh mendapatkan wawasan tentang kesilapan yang dibuang oleh skrip silang domain. Walau bagaimanapun, jika boleh, masih disyorkan untuk menetapkan sifat dan tajuk CORS. try/catch
Artikel ini dibuat dengan kerjasama Sentry.io. Terima kasih kerana menyokong rakan kongsi yang membuat SitePoint mungkin.
Jika anda telah menggunakan acara JavaScript sebelum ini, anda mungkin menghadapi situasi berikut:
onerror
. Ini menyakitkan kerana walaupun ralat berlaku, anda tidak tahu apa kesilapannya, atau kod mana yang ralat berasal. Dan keseluruhan tujuanApabila ralat berasal dari fail JavaScript dari sumber yang berbeza (nama domain, port, atau protokol yang berbeza), penyemak imbas menghantar "ralat skrip" ke fungsi panggilan balik
adalah untuk mendapatkan wawasan tentang kesilapan yang tidak diketahui dalam permohonan itu. onerror
window.onerror
untuk lebih memahami apa yang sedang berlaku, pertimbangkan contoh dokumen html contoh berikut, dengan asumsi ia berasal dari
:
http://example.com/test
<!DOCTYPE html> <html> <head> <title>example.com/test</title> </head> <body> <🎜> <🎜> </body> </html>
panggilan yang akan sentiasa membuang http://another-domain.com/app.js
. foo
ReferenceError
// another-domain.com/app.js function foo() { bar(); // ReferenceError: bar 不是函数 }
window.onerror
yang tidak dapat dikawal. Oleh itu, penyemak imbas hanya membenarkanIni bukan ralat JavaScript - penyemak imbas sengaja menyembunyikan fail skrip dari sumber yang berbeza untuk alasan keselamatan. Ini adalah untuk mengelakkan skrip daripada tidak sengaja membocorkan maklumat yang berpotensi sensitif ke dalam fungsi panggilan balik
untuk mendapatkan wawasan tentang kesilapan yang berasal dari domain yang sama. Apa yang kita tahu ialah ralat berlaku -tidak mengetahui apa -apa lagi! onerror
window.onerror
Walaupun penyemak imbas dalam niat baik, anda ingin menggali jauh ke dalam kesilapan yang dibuang oleh skrip dari sumber yang berbeza, dan ada beberapa alasan yang sangat baik:
static.sentry.io/app.js
). Tetapi jangan risau! Pemahaman yang lebih mendalam tentang kesilapan JavaScript yang disediakan oleh fail -fail ini hanya memerlukan beberapa tweak mudah.
Penyelesaian: CORS Properties and Headers
Untuk memahami pengecualian JavaScript yang dibuang oleh skrip dari sumber yang berbeza, anda perlu melakukan dua perkara.
crossorigin="anonymous"
<!DOCTYPE html> <html> <head> <title>example.com/test</title> </head> <body> <🎜> <🎜> </body> </html>
2.
// another-domain.com/app.js function foo() { bar(); // ReferenceError: bar 不是函数 }
, pelayan menunjukkan kepada penyemak imbas bahawa mana -mana sumber boleh mendapatkan fail ini. Sebagai alternatif, anda boleh mengehadkannya kepada sumber yang diketahui yang anda kendalikan:
<code>Access-Control-Allow-Origin: *</code> Apabila kedua-dua langkah ini selesai, sebarang kesilapan yang dicetuskan oleh skrip ini akan dilaporkan kepada
, sama seperti skrip domain yang sama. Oleh itu, contoh<🎜>
window.onerror
onerror
itu sahaja! "Kesalahan skrip" tidak lagi mengganggu anda dan pasukan anda.
<code>Access-Control-Allow-Origin: *</code>
Alternatif: cuba/menangkap
Kadang -kadang kita tidak dapat menyesuaikan header HTTP skrip aplikasi web kami menggunakan. Dalam kes ini, terdapat alternatif: Gunakan .
Pertimbangkan contoh asal sekali lagi, kali ini menggunakan try/catch
:
try/catch
demi generasi akan datang,
$ curl --head https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.js | \ grep -i "access-control-allow-origin" Access-Control-Allow-Origin: *
some-domain.com/app.js
Jalankan contoh html output dua entri berikut ke konsol:
<code>"ReferenceError: bar 未定义", "http://another-domain.com/app.js", 2, 1, [Object Error]</code>
Kenyataan Konsol Pertama - dari
- berjaya mendapatkan objek ralat yang mengandungi jenis, mesej, dan stack jejak, termasuk nama fail dan nombor baris. Kenyataan konsol kedua dariwindow.onerror = function (message, url, line, column, error) { console.log(message, url, line, column, error); } try { foo(); // 调用 app.js 中声明的函数 } catch (e) { console.log(e); throw e; // 故意重新抛出(由 window.onerror 捕获) }
try/catch
Sekarang, adakah ini bermakna anda perlu cuba menangkap semua kod? Mungkin tidak. Jika anda boleh dengan mudah menukar HTML dan menentukan tajuk CORS pada CDN, lebih baik untuk melakukan ini dan melekat dengan window.onerror
.
Tetapi, jika anda tidak mengawal sumber-sumber ini, membungkus kod pihak ketiga menggunakan window.onerror
adalah cara yang boleh dipercayai (walaupun membosankan) untuk mendapatkan pemahaman yang lebih mendalam tentang kesilapan yang dibuang oleh skrip silang domain.
NOTA: Secara lalai, JavaScript SDK Raven.js Sentry dengan teliti mengesan kaedah terbina dalam untuk cuba membungkus kod anda secara automatik dalam blok try/catch
. Ini dilakukan untuk cuba menangkap mesej ralat dan tumpukan jejak untuk semua skrip, tanpa mengira dari mana asalnya. Jika boleh, masih disyorkan untuk menetapkan sifat dan tajuk CORS.
Sudah tentu, terdapat banyak alat sumber komersial dan terbuka yang boleh melakukan semua mengangkat berat untuk anda. (SHH: Anda mungkin mahu mencuba debugging JavaScript dengan Sentry.)
itu sahaja! Pemantauan ralat gembira.
FAQ ralat skrip
(bahagian Soalan Lazim ditinggalkan di sini, kerana artikel itu terlalu panjang dan mempunyai korelasi yang lemah dengan subjek artikel, anda boleh menambah atau mengubah suai FAQ sendiri seperti yang diperlukan)
Atas ialah kandungan terperinci Apa maksud 'ralat skrip'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!