不可解な「スクリプトエラー」。ChromeおよびFirefoxのJavaScriptで報告


199

私のウェブサイトでJavaScriptエラーを検出し、レポート用にバックエンドに送信するスクリプトがあります。最初に発生したエラー、想定される行番号、および時刻を報告します。

doctypeを含めるように編集します。

<!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>

このスクリプトのおかげで、私のサイトで起こっているjavascriptエラーに鋭く気づいています。最大の違反者の1つは「スクリプトエラー」です。行 0。Chrome10以降、Firefox 3以降。このエラーはInternet Explorerには存在しません(または別の名前で呼ばれている可能性があります)。

修正(2013年5月23日):この「スクリプトエラー、行0」エラーは、IE7およびおそらく他のバージョンのIEで表示されるようになりました。この動作は以前は存在していなかったため、おそらく最近のIEセキュリティパッチの結果です。

誰かがこのエラーの意味やそれを引き起こす原因を知っていますか?それは私の全体のページロードの約0.25%で発生し、報告されたエラーの半分を表しています。


あなたのDoctypeは何ですか?XHTML doctypeを宣言しない場合は、CDATAは必要ないため、スクリプトエラーが発生する可能性があります。
ジェームズ

私は助けに感謝します... doctype:XHTMLを追加しました。また、ページロードの0.25%でのみ発生します...もっとエキゾチックなものだと思います。
Mike Sherov、

3
@jayp:ちょうど言及しています。XHTML doctypeは引き続きHTMLパーサーです。application/xhtml+xmlXHTMLパーサーで実行するには(XHTML仕様のように)コンテンツを送信する必要があります。XHTMLであると主張するコンテンツはたくさんありますが、通常のHTML Doctypeを送信します。コンテンツ作成者がXHTMLをどのように誤って使用するかにより、ブラウザーはXMLパーサーのみを使用することを決定しましたapplication/xhtml+xml(本当に厳密なパーサーです)。hixie.ch/advocacy/xhtmlwebdevout.net/articles/beware-of-xhtmlは、 XHTMLとHTMLパーサを使用しない理由を述べています。
Konrad Borowski、

11
ため息...神の愛のために、これを読んでいる人は誰でもエラーメッセージに問題点を正確に説明してください!それを書くのに30秒の労力を節約することによって、あなたは世界の数年を無駄にしています!
Roman Starkov

1
エラーロードスクリプトエラーは無視しています。どうして?彼らは無視しても安全ですか?
2012年

回答:


261

「スクリプトエラー」。Firefox、Safari、Chromeで例外がブラウザの同じ生成元のポリシーに違反している場合、つまり現在のページのドメイン以外のドメインでホストされているスクリプトでエラーが発生した場合に発生します。

この動作は意図的なものであり、スクリプトが情報を外部ドメインに漏らすのを防ぎます。これが必要な理由の例として、誤ってにアクセスしたevilsite.com場合を想像してください<script src="yourbank.com/index.html">。(はい、JSではなく、htmlでそのスクリプトタグをポイントしています)。これによりスクリプトエラーが発生しますが、ログインしているかどうかを確認できるため、エラーは興味深いものです。ログインしている場合はエラーになる可能性がありますが、ログインし'Welcome Fred...' is undefinedていない場合はエラーになる可能性があります'Please Login ...' is undefined。それらの線に沿った何か。

evilsite.comが上位20か所程度の銀行機関に対してこれを行う場合、彼らはあなたがどの銀行サイトにアクセスするかについてかなり良い考えを持っており、はるかにターゲットを絞ったフィッシングページを提供する可能性があります。(もちろんこれは、ほんの一例である。しかし、ブラウザが許可してはならないなぜそれが示して任意のクロスドメインの境界にデータを。)

私はこれをSafari、Chrome、Firefoxの最新バージョンでテストしました-彼らはすべてこれを行います。IE9はそうではありません-x-origin例外をsame-origin例外と同じように扱います。(そしてOperaはonerrorをサポートしていません。)

馬の口から:onerror()に例外を渡すときにオリジンをチェックするWebKitソース。そしてチェックするFirefoxのソース

更新(10/21/11)この問題を追跡するFirefoxのバグには、この動作に影響を与えたブログ投稿へのリンクが含まれています。

更新(12/2/14):スクリプトタグにcrossorigin属性を指定し、サーバーに適切なCORS HTTP応答ヘッダーを送信させることで、一部のブラウザーで完全なクロスドメインエラーレポートを有効にできるようになりました。


3
これをありがとう。少し説明をお願いします。自分のページに常に含めているスクリプトからの詳細なエラーメッセージが表示されます。たとえば、googleのcdnからjQueryを含め、それを使用してページ上の存在しない要素を操作すると、googleのCDNを指すエラーが発生します。「スクリプトエラー」と言っていますか?リモートスクリプトが例外をスローしているために起こっていますか?
Mike Sherov、2011年

150
何が問題だったのかと思ってしまうのではなく、「リモートスクリプトが同じ生成元のポリシーにより非表示にされたエラーをスローしました」と言う感覚があるだろうと思ったでしょうか?
Roman Starkov

3
@broofaこれは、GoogleのCDNを使用する代わりにドメインでjqueryをホストした場合に、exceptinosが改善されることを意味しますか?
ポールビガー

6
小さな更新。また、file://を介してページが読み込まれ、eval()を介してスクリプトが実行されると、ローカルで発生します。マイナーユースケースですが、それでも:)
Willem Mulder

6
調査の結果Script Error.、ユーザーがJavaScriptのコードにエラーを挿入するSafari拡張機能(Firefoxプラグインの場合も同じ)をインストールした場合にも発生することに気付きました
Alex Hoppen

49

将来この質問に遭遇する人のための更新:broofaは正解であり、これに対する回避策はありません。

明らかに、他にもこの制限に遭遇し、Firefoxのバグ69301およびWebKitのバグ70574に修正を要求するいくつかのバグが提出されました。

良いニュースは、Firefox 13のリリースでFirefoxのバグが解決されたことです。次のように使用します。

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

crossoriginに相当しcrossorigin=anonymous、資格情報を送信せずにスクリプトのCORSフェッチ実行するようブラウザに指示します。

スクリプトはAccess-Control-Allow-Origin、要求元ドメインと一致するHTTPヘッダー値を使用して送信されるようにする必要があります。たとえば、

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

それ以外の場合、ブラウザはスクリプトのロードをキャンセルします

Apacheの場合:

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

他のWebサーバーの CORSの例を参照してください。)

PHPでスクリプトを送信する場合:

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

私はこれをテストしましたが、期待どおりに動作します。script.jsからのすべてのエラーは、window.onerrorメッセージ、ファイル、および行の詳細とともにハンドラーによってキャッチされます。

WebKitのバグはまだ修正されていませんが、パッチが提案されています(同じソリューションを使用しています)。うまくいけば、修正はすぐにリリースされます。

ここでCORSの詳細情報:http : //enable-cors.org/



1
re re webkit。これを意味している場合、それは現在解決されているようです:bugs.webkit.org/show_bug.cgi
id=

3
mysite.com/index.phpのJSエラーを監視したいとします。これには、外部パーティ(たとえば、APIプロバイダーのサーバーapiprovider.com/api.js)からのJSファイルが含まれます。この場合、そのサーバーにはアクセスできないため、「Access-Control-Allow-Origin」ヘッダーを追加できません。api.jsから発生したエラーメッセージを取得する方法はありますか?
Eugenio 14

23

これは理解するのにかなり時間がかかりました。

私たちは、Ajaxを介してWHOLEドキュメントの本体をサーバーにダンプして戻すなど、さまざまなことを試して解決しました。

「スクリプトエラー」の原因はまだわかりません。(ピリオドBTWの場合、Ajaxロガーではこのように表示されます)Firefoxでは、Chromeでそれを絞り込むことができました...

ドラムロール...

Google Chromeの自動翻訳機能。

多くの英語を話す人々はおそらくこの機能についてさえ知らないでしょうが、それをテストするために、Chromeを使用して英語以外のサイトにアクセスすると思います。さらに良いことに、Chromeのオプションを掘り下げた場合、ブラウザの言語を変更する余地があります。それを英語以外の何かに変更し、ブラウザを再起動して、英語のサイトにアクセスします。

Chromeでページを翻訳するかどうかを尋ねる上部のバーを取得する必要があります。

いずれにせよ、いずれにしても、トランスレーターはドキュメントの本文にスクリプトタグを挿入し、(ここで推測すると)ある種のJSベースのシステムを使用してコンテンツをGoogleのサーバーに送信し、翻訳してもらうため、問題の原因でした。

コンソールでのエラーは未参照のものでしたが、window.onerrorに送信されていたメッセージは「スクリプトエラー」でした。

とにかく、治療法があります。

http://googlewebmastercentral.blogspot.com/2007/12/answering-more-popular-picks-meta-tags.html

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

これは2つのことを行います(私たちが知る限り、多分もっと?):

a)変換バーがChromeに表示されないようにします。

b)translate.google.comによるページの翻訳を無効にします。

とにかく、私たちの状況では、これによりこれらの「スクリプトエラー」のA TONが解決されました。私たちが経験していた問題。

この投稿のスペルミスをお詫びします。これを書いているChromeではまだ英語以外のモードであり、スペルチェッカーが英語に設定されていません;)戻る時間です。

楽しい!


4
直接的な理由は、おそらく、トランスレータスクリプトがWebページとは異なるドメインから実行されたためでありonerror(少なくともFirefoxでは)、このような場合は「スクリプトエラー」と表示されるだけです。
Tgr

10

%が低いため、彼らは通常のユーザーではないと想定できます。おそらく、ユーザースクリプト、ブックマークレットを使用しているユーザーや、Webサイトのコンソールをいじっているだけかもしれません。ページ全体のHTMLが存在する場合、この理論のテストに役立ちます。完全なエラーと同様に。それはあなたにURLを与えるはずです、それは常に同じですか?行は本当に0ですか、それとも未定義ですか?

onerrorでデフォルト値を設定することは良い考えではないと思います。0はおそらくparseInt(ln || 0)、エラーが実際にはページにないときに発生します(上記の例を参照)。

JavaScriptでこれらのエラーを無視する行(おそらく独自のコードに由来しないため)か、サーバー側のコードで個別に処理する行がわかっているかどうかを確認するifを追加すると、imoの方が優れています。

===編集===入手先:http : //www.xavierm02.net/AZE/ user.jsファイルをインストールします(Chromeで実行しましたが、Firefoxでも動作するはずです)。次に、同じブラウザでHTMLページを開きます。エラーが表示されます(サーバーへのレポート作成の変更のみを変更し、ページに書き込みます)。行番号として0を使用します。


URLは私のサイトのページ間で均等に配布されています。FFとクロームを考慮して、ブックマークレットや拡張機能、テーマも推測しています。ただし、安全に無視する前に、このエラーメッセージを正確に再現できるようにしたいと思っています。
Mike Sherov、2011年

行をに置き換えると、(new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url) + "&ln=" + parseInt(ln) + "&r=" + (+new Date());URLは表示されません(これは拡張機能またはローカルなものであるため、ブラウザーには表示されません)と行番号は表示されません。
xavierm02

そしてところで、JSではなくサーバーでタイムスタンプを取得する必要があります(タイムスタンプの代わりにバージョンを取得することもできます)。
xavierm02

1
実際、JSは生データを送信するだけで、PHPはロードエラーなどを無視するように処理する必要があります。
xavierm02、

私はJS側でいくつかの処理を行います。これは、最初の関連エラーのみを報告したいので、実際のエラーが発生した後、onerror関数を何にも戻さないようにします。これにより、ループで発生しているエラーがサーバーをddo 。
Mike Sherov、

3

同様の問題がありました。私のスクリプトはサブドメインによって提供されており、同じオリジン制限に該当します。しかし、私はこれを解決しました:

1)次のようにすべてのスクリプトタグを追加します。

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

2)すべてのvhost内に次のコードを追加して、apache httpd.confを変更します(mod_headersを有効にする必要があります)。

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

お役に立てれば ...

編集

私のサーバーの1つでは、交換することを除いて、これを機能させることができませんでした

*.mydomain.tld

沿って

*

拡張情報の*フィッシングを可能にする可能性のある欠陥に注意してください。CORS、same-origin、img&fonts、cdnに関するドキュメントは入手可能ですが、スクリプトタグのクロスオリジンの詳細については入手できません。


1
「* .mydomain.tld」は、crossorigin属性developer.mozilla.org/en-US/docs/Web/HTML/…の
icenac

1

Chromeでは、からHTMLとJavascriptの両方をロードすると、「スクリプトエラー」(0行目)も発生しますfile://。これはFirefoxでは発生しません。おそらく、Chromeの熱狂的な同一生成元保護。

HTTP経由で同じHTMLとJavaScriptをロードする場合は、すべて問題ありません。


1

以下はどうですか。スクリプトエラーはJavaScript経由では利用できないため、その特定のケースを分離して、できる限り最善の方法で処理してください。

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;
};

カルマにこれをどのように記録しますか?
CommonSenseCode 2018年

ブラウザコンソールに詳細があるが、onerrorにはないということですか?
Michael Freidgeim


0

iOS上のChromeとFirefoxはどちらもSafari Webviewに基づいていますが、読み込まれる各ページに一連のカスタムスクリプトを挿入します。これらのスクリプトのいずれかで問題が発生した場合はScript error on line 0、同様に報告されます。(ブラウザが挿入したスクリプトもクロスオリジンとしてカウントされます)

私がこの他のSOスレッドを追跡して文書化したように、iOS上のChromeとFirefoxの両方で、SVG要素を正しく処理するカスタムスクリプトに問題があります。したがって、このスレッドの他のすべての回答に加えて、ページの<a>タグ内でSVG要素とタグを使用すると、iOS ChromeとiOS Firefoxで報告されます。<svg>Script errors


-1

Safari(WebKit)で何が修正されたかをお話しします。JSコールバックルーチンを実際に配置した場合 にページに配置すると、完全な情報が得られます。タグを介して.jsファイルに含めた場合、「スクリプトエラー」エラー(行番号なしなど)が発生するだけです。

たぶんこれは、Broofaの発言に関連しているのかもしれません。

Anwyay、これでページに小さなコールバックがあり、残りのファイルはページの外にあります。


-2

少し検索しましたが、「スクリプトエラー」は、検索するように求められたファイルの読み込みに問題があったことを意味しているようです。これは、クライアント側のキャッシングの問題であるか、過負荷によるサーバーの問題である可能性があります。

これはおそらく、スクリプト自体がロードできないファイルであるために、行0でエラーが発生していることが原因です。

<script type="text/javascript" src="somescript.js"></script>

良い考えですが、スクリプトの読み込みに失敗した場合は明示的に無視します。具体的にはそのエラーを検出し、無視します。
Mike Sherov、

1
スクリプトの読み込みに失敗したことをどのように検出しましたか?ある時点でそれについて問題があったことを覚えています。script.onerror一部のブラウザでは、不足しているスクリプトが原因で起動していませんでした。
チャーリーキリアン

「ソースエラー。」(little-e)は、webkitとFFソースの両方に表示されます。上記の私の答えを参照してください。fwiw。
broofa

-3

私は経験した

スクリプトエラー。行0

お客様のブラウザでエラーが発生した場合、しばらくの間、エラーがサーバーに報告されます。昨日("use strict";JavaScriptで導入した後)、この問題をWindows 7のSafariとChromeで再現できました。alert()ステートメントでコードを散らかした後、未定義の変数を使用してこのエラーを追跡しました!たとえばxx = 123;xxvarステートメントで定義されていない場合。

Safariはこれを

ReferenceError:Strictモードはグローバルプロパティ 'xx'の暗黙的な作成を禁止します

Webインスペクター内で、window.onerror関数が検出していました

スクリプトエラー。行0


-11

Firefoxのソースコードを確認すると、がないことがわかり"Script Error."ます。したがって、サイト上のスクリプトが次のようなキャッチされていないエラーをスローしている可能性が非常に高くなります。

throw new Error('Script Error.');

おそらく、この声明はFirefoxとChromeでのみ到達します。

行番号がない理由はわかりません。たぶんいくつかのeval()問題?


1
私はあなたが推奨したとおりにこれを投げてみました。「スクリプトエラー」は報告されません。「スローされた例外がキャッチされませんでした:スクリプトエラー」と報告されます。でもいい考えだ。
Mike Sherov、2011年

エラーの原因となっているのは、ユーザーがインストールした拡張機能の1つである可能性もあります。
チャーリーキリアン

1
ありえない。適切な場所を見ると、Web全体で「スクリプトエラー」が表示されます。
アマルゴビナス2012

2
ええと、違う。これは実際には「スクリプトエラー」です。小さな「e」で。それが、ソースコードでそれが見つからなかった理由です。
user123444555621 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.