2015-01-09 14 views
10

私はサードパーティのサーバからロードするスタンドアロンスクリプトファイル持っている:リモートスクリプトは(404)時には、そこではないだろう、と私はしたい小さなチャンスがありますリモートのjavascriptファイルを読み込めないと、どのブラウザでもJavaScriptの実行が停止しますか?

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

私のアプリは、スクリプトが(それはある種の分析トラッカーです)

を動作するようにロードする必要がないため、このスクリプトを含むことは私のアプリがどのように動作するかに影響しないことを確認してください、私は含めることができますこのスクリプトは安全にそれをブロックせず、JavaScriptエラーを引き起こすこともありません。他のjavascriptの実行を停止するアプリですか?

私が遅延したスクリプトの負荷を作るためにasyncdefer属性を追加することを考えていました。これで十分ですか?私のアプリはIE8以上で動作する必要があります。ここで

は、私が今考えているものです:

<script async defer type="text/javascript" src="//some_server/logger.js"></script> 

<script type="text/javascript"> 
console.log("I want this to always execute, no matter if the above script 404's or not!"); 
</script> 
+1

scriptタグの非同期属性または遅延属性を使用して、ページのレンダリングが停止するのを回避します。 – dandavis

+0

これは私の現在の考えですが、スクリプトが時々存在しない場合(例:404)、これによって問題が発生しますか? –

+0

スクリプトに依存するページに他のjsがある場合は、jquery .getscript関数を使用することをお勧めします。 http://api.jquery.com/jquery.getscript/次に、すべての依存コードをコールバックの中に入れます。スクリプトがロードされていない場合、他のすべてのコードは正常に実行されます。 – Buck3y3

答えて

5

このスクリプトをブロックすることなく、または他のJavaScriptの実行を停止する私のアプリケーションで JavaScriptエラーが発生することはありませんか?

YESあなたは

404は、どのような方法でのJavaScriptの実行を停止しないことができ、エラーのみが行います。
サーバーが404で応答し、ハングしない限り、スクリプトが読み込まれても目立つ遅延は発生しません。

これは、404または壊れたリンクを確認するのにかかる時間を記録することによって、さまざまなブラウザでテストできます。
ブラウザが時刻を記録するということは、スクリプトがjavascriptの実行を停止しないことを示しています。パーサーがスクリプト内でエラーを検出しない限り、スレッドは常に次のスクリプトタグに進みますブラウザがエラーをスローすることはありません。URLが解決されなくなるとただちに表示されます。

<script>console.time('Test');</script> 
<script type="text/javascript" src="http://www.broken.url/file.js"></script> 
<script>console.timeEnd('Test');</script> 

FIDDLE

IEでのテスト、クロム、FirefoxとOperaがすべてのブラウザが壊れたリンクを解決するために以下の0.0002秒を使用することを示しており、それは404を解決するのにかかる時間はどのくらいの速に依存しますサーバーは応答しますが、Googleのサーバーでは、404ステータスコードが返される前にすべてのブラウザで一貫して0.2秒未満になり、ブラウザは次のスクリプトを実行し続けます。でも、すべては404サーバが解決し、言い換えれば

FIDDLE

に移動するための半秒よりも一般的にはあまりかかり、あなたが安全に持っている任意のスクリプトを追加することができ返す20のスクリプトを加算

壊れたリンクや404を返す、それは何も壊すことはありません、そして、何らかの方法でブラウザをハングしません、それは現代のブラウザがスクリプトが読み込まれることができないと判断するために数ミリ秒かかるだけで、 。

実際に読み込まれ、致命的なエラーが含まれているスクリプトをインクルードすると、スレッド全体が停止し、エラーが発生した後にスクリプトが実行されます。

+0

これは私が期待しているものですが、実際のブラウザの結果、クロスプラットフォームなどのソースを見たいと思っています...ありがとう ! –

+2

@BradParks - 動作を説明しようとするために、もう少しコンテキストを答えに加えました。ブラウザが読み込むことができないスクリプトを処理する方法はベンダーによって異なりますが、標準はありませんが、これは非常に頻繁に起こり、スクリプトが消えたり、サーバーがダウンしたりします。何の問題もなく信頼性があります。 – adeneo

4

は、スクリプトをロードする前に、空の関数として(//some_server/logger.jsである)あなたが使用するすべての関数を定義して、あなたはありませんでしょうスクリプトをロードせずにスクリプトを使用しても例外が発生します。

<script type="text/javascript"> 
    functionInLogger = function() { 
    }; 
    functionInLogger2 = function() { 
    }; 
    ... 
</script> 
<script type="text/javascript" src="//some_server/logger.js"></script> 

<script type="text/javascript"> 
    functionInLogger(); 
    functionInLogger2(); 
    console.log("This will always work"); 
</script> 

スクリプトが読み込まれると、空の関数が上書きされます。

404で実行を停止する一般的なブラウザが見つかりませんでした.W3標準ではこれが記載されています。 (W3

ユーザエージェントは、スクリプトブロックを実行するために必要とされるとき、それは、次の手順を実行する必要があります。

を...

負荷がエラーになった場合(例えば、aのDNSエラー、またはHTTP 404エラー) スクリプトブロックの実行は、要素にerrorという名前の単純なイベントを発生させるだけで構成する必要があります。

+0

フィードバックに感謝しますが、スクリプトは機能を公開していません.... Googleアナリティクスのようなもので、実際には私のアプリでは使用されていませんが、現在のURLやその他のブラウザの情報をログに記録しています。だから私のアプリはこのファイルに依存していないので、ロードしていない私のアプリの機能が動作するのを止めることはありません。 –

+0

それから、自分で呼び出さない限りコードに介入することはありません。 –

1

あなたの重要なスクリプトの後ろにそのスクリプトを配置して、ページのレンダリングをブロックしないようにすることができます。

また、ドキュメントの準備ができてからロードすることもできます。このメソッドは、スクリプトが見つからない場合に余分な読み込み時間を与えません。例:

$(document).ready(function() { 
    $('head').append('<script type="text/javascript" src="//some_server/logger.js"></script>'); 
}); 

または使用$ .getScript方法

$(document).ready(function() { 
    $.getScript('//some_server/logger.js', function(data, textStatus) { 
     /*optional stuff to do after getScript */ 
    }); 
}); 

*私はあなたがjQueryの

1

を使用している場合を前提と上記の例では、私はあなたがRequireJSようなものを使用すべきだと思います。

からWiki: 開発者は、モジュールが実行される前にロードする必要がある依存関係を定義することができるため、モジュールはまだ使用できない外部コードを使用しようとしません。

関連する問題