2016-08-18 5 views
0

私は、ページの要求に応じていくつかのjsを読み込むために基本ローダーを使用しています。 1台または2台のマシン(私はそれらのマシンにアクセスできない)で、「Uncaught SyntaxError:xxxの無効または予期しないトークン」または「Uncaught SyntaxError:予期しないトークンILLEGAL」のようなエラーが発生します。ヘッダースクリプトのjs解析エラーをキャッチ

もちろん、ソースファイルは正常です。これは何千ものクライアントで動作しています。確かにこれは私のjsファイルを変更しているいくつかのアンチウイルスでなければなりませんが、私はこれについてクライアントに通知するか、少なくとも通知することができるかどうかを知りたいと思います。

私の問題は、私はXMLHttpRequestをを使用してスクリプトをロードし、そして私は、サーバー上のファイルへ

request.onload = function() { 
    var txt = request.responseText + "\n//# sourceURL=" + file + "\n"; 
    try { 
     var script = domDocument.createElement("script"), 
     head = domDocument.head || domDocument.getElementsByTagName("head")[0]; 

     script.defer = true; 
     script.text = txt; 
     head.appendChild(script); 
    } catch (e) { 
     domWindow.onerror("Error loading js.", file, 0, 0, e, txt); 
    } 

    request.onload = function() { }; 
}; 

どこに「ファイル」のポイントのように、ヘッダーにテキストを付加していますonloadイベントだということです。問題は、ブラウザが上記のコードをうまく実行していると思われ、実際のエラーを解析/スローするようにキャッチが実行されないことです。

何らかの形で、私の読み込みスクリプトの中でエラーをキャッチすることができるかどうかを知りたいので、私のjの代わりに実際にブラウザが受け取ったものを報告することができます。

+0

スクリプトを読み込んでテキストとして頭に挿入する理由はありますか?スクリプトタグに 'src'属性を付けるほうがずっと良いでしょう。 – Archer

+0

はい、私はスクリプトがロードされたことを知る必要があるので、ローダーは相互依存するいくつかのスクリプトをロードする必要があるかもしれないので、 – CheloXL

+0

onloadはそれを正確に行います。ホイールを再作成するのではなく、デフォルトの方法を使用する方がよいでしょう。 – Archer

答えて

0

try catchだけでも、構文解析時に発生する構文エラーを検出できません。私が知る限り、構文エラーをキャッチする唯一の方法は、evalを使用することです。

try{ 
    var txt = request.responseText + "\n//# sourceURL=" + file + "\n"; 
    eval(txt); 
    var script = domDocument.createElement("script"), 
    head = domDocument.head || domDocument.getElementsByTagName("head")[0]; 

    script.defer = true; 
    script.text = txt; 
    head.appendChild(script); 
}catch(er){ 
    console.log(er); 
} 

このアプローチはお勧めできません。 URLを介してスクリプトファイルをロードした後、scriptタグとwindowオブジェクトの両方でerrorイベントを監視する方が良いでしょう。

window.onerror = function(msg, url, lineNo, columnNo, error){ 
    console.log(msg, url, lineNo, columnNo, error); 
} 
var script = domDocument.createElement("script"), 
    head = domDocument.head || domDocument.getElementsByTagName("head")[0]; 

script.defer = true; 
script.onerror = function(er){ 
    console.log(er); 
}; 
script.onload = function(){ 
    console.log('script loaded'); 
}; 
script.src = '/path/to/script.js'; 
head.appendChild(script); 
+0

Mmm ...スクリプトがロードされた時を知る必要があるので、私はそれを行うことができませんが、おそらくスクリプトタグにonerrorハンドラを付けることができます。試してみるが、それはうまくいくと思いますか? – CheloXL

+0

@CheloXL 'load'イベントを聞いて、スクリプトがロードされているかどうかを確認することもできます。私はこの変更のための私の答えを更新しました。あなたのアイデアについて、私はそれが動作しないと思う。 – Lewis

+0

あなたの最初のアプローチを試してみてください。エラーは決して解雇されません。また、onloadは常に実行されます(スクリプトokまたはスクリプトnot ok)。 ChromeとFFで試してみました。 – CheloXL