Saya memiliki skrip yang mendeteksi kesalahan Javascript di situs web saya dan mengirimkannya ke backend saya untuk pelaporan. Ini melaporkan kesalahan pertama yang ditemui, nomor baris yang seharusnya, dan waktu.
EDIT untuk memasukkan tipe dokumen:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" xmlns:fb="http://www.facebook.com/2008/fbml">
...
<script type="text/javascript">
//<![CDATA[
// for debugging javascript!
(function(window){
window.onerror = function(msg, url, ln) {
//transform errors
if (typeof(msg) === 'object' && msg.srcElement && msg.target) {
if(msg.srcElement == '[object HTMLScriptElement]' && msg.target == '[object HTMLScriptElement]'){
msg = 'Error loading script';
}else{
msg = 'Event Error - target:' + msg.target + ' srcElement:' + msg.srcElement;
}
}
msg = msg.toString();
//ignore errors
if(msg.indexOf("Location.toString") > -1){
return;
}
if(msg.indexOf("Error loading script") > -1){
return;
}
//report errors
window.onerror = function(){};
(new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url || document.location.toString().replace(/#.*$/, "")) + "&ln=" + parseInt(ln || 0) + "&r=" + (+new Date());
};
})(window);
//]]>
</script>
Karena skrip ini, saya sangat menyadari adanya kesalahan javascript yang terjadi di situs saya. Salah satu pelanggar terbesar adalah "Script Error." on line 0. di Chrome 10+, dan Firefox 3+. Kesalahan ini tidak ada (atau mungkin disebut sesuatu yang lain?) Di Internet Explorer.
Koreksi (23/5/2013): Kesalahan "Script Error, Line 0" ini sekarang muncul di IE7 dan mungkin versi IE lainnya. Mungkin akibat dari patch keamanan IE baru-baru ini karena perilaku ini sebelumnya tidak ada.
Adakah yang tahu apa arti kesalahan ini atau apa yang menyebabkannya? Ini terjadi pada sekitar 0,25% dari keseluruhan pageload saya, dan mewakili setengah dari kesalahan yang dilaporkan.
sumber
application/xhtml+xml
untuk menjalankannya di parser XHTML (seperti spesifikasi XHTML katakan). Ada banyak konten yang mengklaim sebagai XHTML, tetapi mengirimkan dokumen HTML normal. Karena betapa salahnya pembuat konten menggunakan XHTML, browser memutuskan untuk hanya menggunakan parser XMLapplication/xhtml+xml
(itu benar-benar parser ketat). The hixie.ch/advocacy/xhtml dan webdevout.net/articles/beware-of-xhtml mengatakan mengapa tidak menggunakan parser HTML dengan XHTML.Jawaban:
"Kesalahan skrip." terjadi di Firefox, Safari, dan Chrome ketika pengecualian melanggar kebijakan yang berasal dari browser yang sama - yaitu ketika kesalahan terjadi pada skrip yang di-host pada domain selain dari domain halaman saat ini.
Perilaku ini disengaja, untuk mencegah skrip membocorkan informasi ke domain eksternal. Untuk contoh mengapa ini perlu, bayangkan mengunjungi secara tidak sengaja
evilsite.com
, yang menyajikan halaman<script src="yourbank.com/index.html">
. (ya, kami mengarahkan tag skrip itu ke html, bukan JS). Ini akan menghasilkan kesalahan skrip, tetapi kesalahan itu menarik karena dapat memberi tahu kami apakah Anda masuk atau tidak. Jika Anda masuk, kesalahannya mungkin'Welcome Fred...' is undefined
, sedangkan jika tidak, mungkin demikian'Please Login ...' is undefined
. Sesuatu seperti itu.Jika evilsite.com melakukan ini untuk 20 atau lebih institusi bank, mereka akan memiliki gagasan yang cukup bagus tentang situs perbankan mana yang Anda kunjungi, dan dapat memberikan halaman phishing yang lebih bertarget. (Ini hanya satu contoh, tentu saja. Tapi itu menggambarkan mengapa browser tidak boleh membiarkan data apa pun untuk melewati batas domain.)
Saya sudah menguji ini di versi terbaru dari Safari, Chrome, dan Firefox - mereka semua melakukan ini. IE9 tidak - itu memperlakukan pengecualian asal x sama dengan yang asal sama. (Dan Opera tidak mendukung satu kesalahan.)
Dari mulut kuda: Sumber WebKit yang memeriksa asal ketika memberikan pengecualian ke onerror (). Dan sumber Firefox yang memeriksa .
UPDATE (10/21/11) : Bug Firefox yang melacak masalah ini mencakup tautan ke posting blog yang menginspirasi perilaku ini.
PEMBARUAN (12/2/14) : Sekarang Anda dapat mengaktifkan pelaporan kesalahan lintas domain lengkap pada beberapa browser dengan menentukan
crossorigin
atribut pada tag skrip dan meminta server mengirim header respons HTTP CORS yang sesuai .sumber
Script Error.
juga terjadi jika pengguna telah menginstal Ekstensi Safari (mungkin sama untuk Firefox Plug-Ins) yang menyuntikkan kode JavaScript dengan kesalahanPembaruan bagi mereka yang akan tersandung ke pertanyaan ini di masa depan: broofa benar dengan jawabannya dan tidak ada solusi untuk ini.
Jelas ada yang tersandung dalam batasan ini dan beberapa bug yang meminta perbaikan diajukan untuk Firefox: Bug 69301 dan untuk WebKit: Bug 70574
Berita baiknya adalah bahwa bug tersebut telah diatasi untuk Firefox dengan rilis Firefox 13. Ini adalah bagaimana Anda menggunakannya:
crossorigin
setara dengancrossorigin=anonymous
dan memberi tahu browser untuk melakukan pengambilan CORS dari skrip tanpa mengirim kredensial.Anda harus memastikan bahwa skrip dikirim dengan
Access-Control-Allow-Origin
nilai header HTTP yang cocok dengan domain yang meminta, misalnya,jika tidak, browser akan membatalkan pemuatan skrip .
Untuk Apache:
(Dan lihat contoh CORS untuk server web lain .)
Jika Anda mengirim skrip dalam PHP:
Saya sudah menguji ini dan berfungsi seperti yang diharapkan. semua kesalahan dari script.js akan ditangkap oleh
window.onerror
pawang dengan detail pesan, file, dan baris.Bug WebKit belum diperbaiki, tetapi tambalan telah diusulkan (dan menggunakan solusi yang sama). Semoga perbaikannya akan segera dirilis.
Info lebih lanjut tentang CORS di sini: http://enable-cors.org/
sumber
Yang ini butuh sedikit waktu untuk mencari tahu.
Kami melakukan banyak hal untuk mencoba dan menyelesaikannya, termasuk melakukan hal-hal seperti membuang badan dokumen WHOLE kembali ke server kami melalui Ajax untuk mencoba dan mencari tahu.
Saya masih tidak yakin apa yang menyebabkan "Script Error." (dengan BTW periode, itulah yang muncul di Ajax logger kami) di Firefox, tetapi di Chrome, kami dapat mempersempitnya menjadi ...
Drum roll ...
Fitur terjemahan otomatis Google Chrome.
Banyak orang berbahasa Inggris mungkin bahkan tidak tahu tentang fitur ini, tetapi untuk mengujinya, saya kira mengunjungi situs non-Inggris menggunakan Chrome. Atau lebih baik lagi, jika Anda menggali melalui opsi Chrome, ada tempat untuk mengubah bahasa browser. Ubah ke sesuatu yang bukan bahasa Inggris, mulai ulang peramban, dan kunjungi situs berbahasa Inggris.
Anda harus mendapatkan bilah di bagian atas yang menanyakan apakah Anda ingin Chrome menerjemahkan laman untuk Anda.
Dalam kasus kami, penerjemahlah yang menyebabkan masalah karena menyuntikkan tag skrip ke badan dokumen Anda dan (menebak di sini) menggunakan semacam sistem berbasis JS untuk mengirim konten ke server Google dan meminta mereka untuk menerjemahkannya.
Meskipun kesalahan di konsol adalah sesuatu yang tidak direferensikan, pesan yang dikirim ke window.onerror adalah "Script Error.".
Bagaimanapun, ada obatnya.
http://googlewebmastercentral.blogspot.com/2007/12/answering-more-popular-picks-meta-tags.html
Ini akan melakukan 2 hal (sejauh yang kami tahu, mungkin lebih?):
a) Nonaktifkan bilah terjemahan agar tidak muncul di Chrome.
b) Nonaktifkan terjemahan halaman melalui translate.google.com.
Bagaimanapun, dalam situasi kami, ini memecahkan TON dari "Script Error" ini. masalah yang kami alami.
Maafkan kesalahan pengejaan dalam pos ini, saya masih menggunakan mode non-Inggris di Chrome yang menulis ini, dan pemeriksa ejaan tidak disetel ke Bahasa Inggris;) Saatnya untuk beralih kembali.
Nikmati!
sumber
onerror
(setidaknya di Firefox) hanya mengatakan "Kesalahan skrip" dalam kasus seperti itu.Karena% rendah, Anda dapat menganggap mereka bukan pengguna normal. Mungkin pengguna dengan skrip pengguna, bookmarklet atau bahkan mungkin hanya bermain-main dengan konsol di situs web Anda. Memiliki seluruh HTML halaman tempat itu terjadi dapat membantu menguji teori ini. Serta kesalahan lengkap. Seharusnya memberi Anda url, apakah selalu sama? Apakah garisnya benar-benar 0 atau hanya tidak terdefinisi?
Saya tidak berpikir menetapkan nilai-nilai default di Anda satu kesalahan adalah ide yang baik dan 0 mungkin berasal dari
parseInt(ln || 0)
ketika kesalahan tidak benar-benar di halaman (lihat contoh di atas).Menambahkan tanda "if" untuk melihat apakah garis tersebut dikenal dalam JavaScript untuk mengabaikan kesalahan tersebut (karena mereka mungkin tidak berasal dari kode Anda sendiri) atau dalam kode sisi server untuk mengatasinya secara terpisah, imo, akan lebih baik .
=== EDIT === Harus ke: http://www.xavierm02.net/AZE/ Instal file user.js (saya melakukannya di Chrome tetapi harus juga berfungsi pada Firefox). Kemudian buka halaman html di browser yang sama. Ini akan menunjukkan kepada Anda kesalahan (Saya hanya mengubah insteal pelaporan ke server, ia menulisnya di halaman). Dengan 0 sebagai nomor baris.
sumber
(new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url) + "&ln=" + parseInt(ln) + "&r=" + (+new Date());
dan Anda mungkin tidak akan melihat url (karena itu ekstensi atau sesuatu yang lokal sehingga browser tidak menunjukkan Anda) dan tidak ada nomor baris.Saya memiliki masalah yang sama: skrip saya dilayani oleh subdomain dan berada di bawah batasan asal yang sama. Namun, saya menyelesaikan ini dengan:
1) menambahkan setiap tag skrip seperti ini:
2) memodifikasi apache httpd.conf dengan menambahkan berikut ini di dalam setiap vhost (Anda harus enbable mod_headers):
Semoga ini membantu ...
EDIT
Di salah satu server saya, saya tidak dapat membuat ini berfungsi kecuali dengan mengganti
oleh
Waspadai kekurangan dengan * yang berpotensi memperbolehkan informasi tambahan. Dokumentasi tentang CORS, asal yang sama, img & font, cdn tersedia tetapi sangat sedikit tentang detail crossorigin tag skrip yang tersedia.
sumber
Di Chrome, saya juga mendapatkan "Script error" (on line 0) saat memuat HTML dan Javascript dari
file://
. Ini tidak terjadi di Firefox. Mungkin perlindungan Chrome sama asal-usulnya.Semua baik saat memuat HTML dan Javascript yang sama melalui HTTP.
sumber
Bagaimana dengan di bawah ini. Kesalahan skrip tidak tersedia melalui JavaScript sehingga hanya mengisolasi kasus tertentu dan menanganinya sebaik mungkin.
sumber
Artikel bagus yang akhirnya mengarah ke utas ini. https://danlimerick.wordpress.com/2014/01/18/how-to-catch-javascript-errors-with-window-onerror-even-on-chrome-and-firefox/
sumber
Baik Chrome dan Firefox di iOS didasarkan pada Safari Webview tetapi memasukkan sekelompok skrip khusus ke setiap halaman yang dimuat. Jika dalam salah satu skrip itu terjadi kesalahan, itu akan dilaporkan
Script error on line 0
juga. (Browser juga memasukkan skrip yang dihitung sebagai asal silang)Karena saya telah melacak dan mendokumentasikan di utas SO lainnya, Chrome dan Firefox di iOS memiliki masalah dalam skrip khusus mereka yang menangani elemen SVG dengan benar. Jadi, di samping semua jawaban lain di utas ini: Jika Anda menggunakan elemen SVG dan
<a>
tag di dalam<svg>
tag di halaman Anda, itu akan menyebabkanScript errors
dilaporkan di iOS Chrome dan iOS Firefox.sumber
Saya akan memberi tahu Anda apa yang memperbaikinya untuk saya di Safari (WebKit): Jika saya menempatkan rutinitas JS callback di halaman , maka saya mendapatkan info lengkap. Jika saya memasukkannya dalam file .js melalui tag, saya hanya mendapatkan kesalahan "Script error" (tanpa linenumber, dll.).
Mungkin ini terkait dengan apa yang dikatakan Broofa.
Lagi pula, jadi sekarang saya memiliki panggilan balik kecil di halaman, dan kemudian sisa file di luar halaman.
sumber
Saya telah melakukan sedikit pencarian dan tampaknya "Script Error" berarti mengalami kesulitan memuat file yang diminta untuk dicari. Ini bisa menjadi masalah caching di sisi klien, atau bisa juga masalah server karena kelebihan beban.
Kemungkinan besar disebabkan oleh sesuatu seperti ini di mana skrip itu sendiri adalah file yang tidak dapat dimuat, karenanya kesalahan terjadi pada baris 0.
sumber
script.onerror
tidak dipecat karena skrip yang hilang di beberapa browser.Saya sudah mengalaminya
Kesalahan Skrip. baris 0
kesalahan untuk beberapa waktu dilaporkan kembali ke server kami ketika kesalahan terjadi di browser pelanggan. Kemarin untuk pertama kalinya (setelah memperkenalkan
"use strict";
javascript kami) saya bisa meniru masalah ini di Safari dan Chrome pada Windows 7. Setelah mengotori kode kami dengan peringatan (), saya melacak kesalahan ini hingga penggunaan variabel yang tidak ditentukan! misalnyaxx = 123;
di mana xx tidak didefinisikan denganvar
pernyataan.Safari melaporkan ini sebagai
ReferenceError: Mode ketat melarang pembuatan implisit properti global 'xx'
dalam Web Inspector, tetapi fungsi window.onerror mendeteksi
Kesalahan Skrip. baris 0
sumber
Grepping kode sumber Firefox mengungkapkan bahwa tidak ada
"Script Error."
. Jadi, sangat mungkin bahwa beberapa skrip di situs Anda melakukan kesalahan yang tidak tertangkap seperti ini:Mungkin pernyataan ini hanya tercapai di Firefox dan Chrome.
Tidak yakin mengapa tidak ada nomor baris. Mungkin ada
eval()
masalah?sumber