1. ホーム
  2. ジャバスクリプト

[解決済み】ChromeとFirefoxのJavascriptで「Script Error.

2022-04-19 12:09:27

質問

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

doctypeを含むようにEDITしてください。

<!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のエラーを痛感しています。 その中でも、0行目の"Script Error."は大きな問題です。 は、Chrome 10+、Firefox 3+で表示されます。Internet Explorerではこのエラーは存在しない(あるいは別の呼び方をしているかも?

訂正(2013/5/23)。 この "Script Error, Line 0" のエラーは、現在 IE7 およびおそらく他のバージョンの IE で表示されます。以前はこのような動作はなかったため、最近のIEのセキュリティパッチによるものと思われます。

このエラーの意味や原因に心当たりのある方はいらっしゃいますか?私のページロード全体の約0.25%で発生し、報告されたエラーの半分を占めています。

解決方法は?

Firefox、Safari、Chromeでスクリプトエラーが発生するのは、ブラウザの設定に違反する例外が発生した場合です。 セイムオリジンポリシー - つまり、現在のページのドメインとは別のドメインでホストされているスクリプトでエラーが発生した場合です。

この動作は、スクリプトから外部ドメインへの情報漏えいを防ぐために意図的に行っています。 この動作が必要な例として、誤って evilsite.com を含むページを提供し、そのページが <script src="yourbank.com/index.html"> . (そう、scriptタグはJSではなくhtmlに指しているのです)。 この場合、スクリプト・エラーが発生しますが、このエラーは、あなたがログインしているかどうかを教えてくれるので、興味深いものです。 ログインしている場合、エラーは次のようになります。 'Welcome Fred...' is undefined 一方、そうでない場合は、次のようになります。 'Please Login ...' is undefined . そんな感じです。

もしevilsite.comが上位20ほどの銀行機関についてこれを行えば、あなたがどの銀行のサイトを訪れるかについてかなり良い考えを持つことができ、より的を射たフィッシングページを提供できるようになるでしょう。(もちろん、これは一例に過ぎない。 しかし、これは、なぜブラウザが 任意の のデータがドメインの境界を越えてしまうのです)。

最新版のSafari、Chrome、Firefoxでテストしたところ、すべてこのように動作しました。 IE9では、x-originの例外をsame-originの例外と同じように扱います。 (Operaはonerrorをサポートしていません)。

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

アップデート (2011/10/21) : その この問題を追跡するFirefoxのバグ には、この動作のきっかけとなったブログ記事へのリンクが含まれています。

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