Cryptic “Script Error.” dilaporkan dalam Javascript di Chrome dan Firefox

199

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.

Mike Sherov
sumber
Apa DOCTYPE Anda? Jika Anda tidak mendeklarasikan doctype XHTML, maka Anda tidak perlu CDATA, yang bisa menjadi alasan mengapa ada kesalahan skrip.
James
Saya menghargai bantuannya ... Menambahkan DOCTYPE: XHTML. Juga, meskipun, hanya terjadi pada 0,25% dari pageload ... Saya akan berpikir itu sesuatu yang lebih eksotis.
Mike Sherov
3
@ Jayp: Hanya menyebutkan. DOCTYPE XHTML masih parser HTML. Anda harus mengirim konten application/xhtml+xmluntuk 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 XML application/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.
Konrad Borowski
11
Sigh ... untuk kasih Tuhan, siapa pun yang membaca ini, silakan membuat Anda pesan error menjelaskan persis apa yang salah! Dengan menghemat 30 detik usaha menulisnya, Anda menyia-nyiakan tahun-tahun dunia!
Roman Starkov
1
Anda mengabaikan Kesalahan Memuat Skrip Kesalahan. Mengapa? Apakah mereka aman untuk diabaikan?
rampr

Jawaban:

261

"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 crossoriginatribut pada tag skrip dan meminta server mengirim header respons HTTP CORS yang sesuai .

broofa
sumber
3
Terima kasih untuk ini. Saya mau sedikit klarifikasi. Saya melihat pesan kesalahan terperinci dari skrip yang saya sertakan di halaman saya sepanjang waktu. Sebagai contoh, jika saya memasukkan jQuery dari cdn google dan menggunakannya untuk memanipulasi elemen yang tidak ada pada halaman saya, saya mendapatkan satu kesalahan yang menunjuk ke CDN google. Apakah Anda mengatakan bahwa "Script Error." apa yang terjadi karena skrip remote melempar pengecualian?
Mike Sherov
150
Anda akan berpikir seseorang akan memiliki akal untuk mengatakan "Sebuah skrip jarak jauh telah membuat kesalahan yang disembunyikan karena kebijakan asal-sama", daripada membuat Anda bertanya-tanya apa yang salah, eh? ...
Roman Starkov
3
@broofa Apakah ini berarti saya akan mendapatkan pengecualian yang lebih baik jika saya meng-host jquery di domain saya alih-alih menggunakan CDN Google?
Paul Biggar
6
Pembaruan kecil. Ini juga terjadi secara lokal ketika halaman dimuat melalui file: // dan skrip dijalankan melalui eval (). Kasing kecil tetapi masih :)
Willem Mulder
6
Setelah beberapa penyelidikan saya perhatikan bahwa a Script Error.juga terjadi jika pengguna telah menginstal Ekstensi Safari (mungkin sama untuk Firefox Plug-Ins) yang menyuntikkan kode JavaScript dengan kesalahan
Alex Hoppen
49

Pembaruan 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:

<script src="http://somremotesite.example/script.js" crossorigin>

crossoriginsetara dengan crossorigin=anonymousdan memberi tahu browser untuk melakukan pengambilan CORS dari skrip tanpa mengirim kredensial.

Anda harus memastikan bahwa skrip dikirim dengan Access-Control-Allow-Originnilai header HTTP yang cocok dengan domain yang meminta, misalnya,

Access-Control-Allow-Origin: http://myhomesite.example
Access-Control-Allow-Origin: *

jika tidak, browser akan membatalkan pemuatan skrip .

Untuk Apache:

Header set Access-Control-Allow-Origin "*"

(Dan lihat contoh CORS untuk server web lain .)

Jika Anda mengirim skrip dalam PHP:

header('Access-Control-Allow-Origin', 'http://myhomesite.example');

Saya sudah menguji ini dan berfungsi seperti yang diharapkan. semua kesalahan dari script.js akan ditangkap oleh window.onerrorpawang 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/

adig
sumber
2
Ringkasan yang bagus: blog.errorception.com/2012/12/…
sam
1
Re webkit. Jika Anda berarti satu ini, sepertinya itu diselesaikan sekarang: bugs.webkit.org/show_bug.cgi?id=70574
UpTheCreek
3
Katakanlah kita ingin memantau kesalahan JS di mysite.com/index.php, yang mencakup file JS dari pihak eksternal (misalnya server penyedia API API apiprovider.com/api.js); dalam hal ini kami tidak memiliki akses ke server itu sehingga kami tidak dapat menambahkan header "Access-Control-Allow-Origin". Apakah ada cara untuk mendapatkan pesan kesalahan yang berasal dari api.js?
Eugenio
23

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

<meta name="google" content="notranslate"/>

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!

anonim-satu
sumber
4
Alasan langsung mungkin adalah bahwa skrip penerjemah dijalankan dari domain yang berbeda dari halaman web, dan onerror(setidaknya di Firefox) hanya mengatakan "Kesalahan skrip" dalam kasus seperti itu.
Tgr
10

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.

xavierm02
sumber
URL didistribusikan secara merata di antara halaman situs saya. Saya menduga bookmarklet atau bahkan ekstensi atau tema juga, mengingat FF dan kromnya. Namun, saya ingin dapat mem-repro pesan kesalahan ini tepat sebelum mengabaikannya dengan aman.
Mike Sherov
Ganti baris Anda dengan (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.
xavierm02
Dan btw, Anda lebih baik mendapatkan cap waktu dengan server Anda daripada dengan JS (dan bahkan mungkin hanya mendapatkan versi, bukan timestamp).
xavierm02
1
Bahkan, JS seharusnya hanya mengirim data mentah dan PHP harus berhati-hati mengabaikan kesalahan pemuatan dan sebagainya.
xavierm02
Saya melakukan beberapa pemrosesan di sisi JS karena saya hanya ingin melaporkan kesalahan yang relevan PERTAMA, jadi saya menetapkan kembali fungsi onerror kembali ke ketiadaan setelah kesalahan nyata masuk. Ini juga mencegah kesalahan yang terjadi dalam loop dari melakukan server saya .
Mike Sherov
3

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:

<script type="text/javascript" src="http://subdomain.mydomain.tld" crossorigin="*.mydomain.tld" />

2) memodifikasi apache httpd.conf dengan menambahkan berikut ini di dalam setiap vhost (Anda harus enbable mod_headers):

<IfModule mod_headers.c>
Header add Access-Control-Allow-Origin "*.mydomain.tld"
</IfModule>

Semoga ini membantu ...

EDIT

Di salah satu server saya, saya tidak dapat membuat ini berfungsi kecuali dengan mengganti

*.mydomain.tld

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.

spoutnik
sumber
1
"* .mydomain.tld" bukan nilai yang valid untuk pengembang
crossorigin.mozilla.org/en-US/docs/Web/HTML/…
1

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.

Myrne Stol
sumber
1

Bagaimana dengan di bawah ini. Kesalahan skrip tidak tersedia melalui JavaScript sehingga hanya mengisolasi kasus tertentu dan menanganinya sebaik mungkin.

window.onerror = function (msg, url, lineNo, columnNo, error) {
    var string = msg.toLowerCase();
    var substring = "script error";
    if (string.indexOf(substring) > -1){
        alert('Script Error: See Browser Console for Detail');
    } else {
        alert(msg, url, lineNo, columnNo, error);
    }
  return false;
};
Ronnie Royston
sumber
bagaimana Anda mencatat ini di karma?
CommonSenseCode
Apakah Anda memberi tahu bahwa konsol peramban memiliki detail, tetapi satu kesalahan tidak?
Michael Freidgeim
0

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 dilaporkanScript 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 menyebabkan Script errorsdilaporkan di iOS Chrome dan iOS Firefox.

Laszlo Korte
sumber
-1

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.

tidur sebentar
sumber
-2

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.

<script type="text/javascript" src="somescript.js"></script>
Nick Brunt
sumber
Pemikiran yang bagus, tetapi kami secara eksplisit mengabaikan ketika skrip gagal dimuat. Kami mendeteksi kesalahan itu secara khusus dan mengabaikannya.
Mike Sherov
1
Bagaimana Anda mendeteksi ketika skrip gagal dimuat? Saya ingat pernah mengalami masalah dengan itu pada satu titik. script.onerrortidak dipecat karena skrip yang hilang di beberapa browser.
Charlie Kilian
"Kesalahan sumber." (little-e) muncul di sumber webkit dan FF. Lihat jawaban saya di atas. angsa
broofa
-3

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! misalnya xx = 123;di mana xx tidak didefinisikan dengan varpernyataan.

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

Mengembara Zombie
sumber
-11

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:

throw new Error('Script Error.');

Mungkin pernyataan ini hanya tercapai di Firefox dan Chrome.

Tidak yakin mengapa tidak ada nomor baris. Mungkin ada eval()masalah?

pengguna123444555621
sumber
1
Saya sudah mencoba melempar ini persis seperti yang Anda rekomendasikan. Itu tidak melaporkan "Kesalahan Skrip.". Ini melaporkan "Pengecualian Dilemparkan tidak tertangkap: Kesalahan Skrip.". Pemikiran yang bagus.
Mike Sherov
Mungkin juga salah satu ekstensi yang dipasang oleh pengguna yang menyebabkan kesalahan.
Charlie Kilian
1
Tidak mungkin. Anda akan melihat "Kesalahan Skrip" di seluruh web jika Anda melihat di plaes yang tepat.
Amalgovinus
2
Tidak, tidak. Ini sebenarnya "Kesalahan skrip." dengan "e" kecil. Itu sebabnya saya tidak menemukannya dalam kode sumber.
user123444555621