2013-05-08 23 views
7

このコードサンプルは、特定の名前のないベンダーのドキュメントにあります。それは、スクリプトを非同期的にロードしてから、そこから関数を呼び出すようです。私は、未定義のチェックが明白なエラーを防止することを認識していますが、これは完全に間違っていませんか?Javascript Async = true属性

IE8/9では、正しく動作しますが、LOADER_URLスクリプトがロードされて実行されるまで実行をブロックすると思います。私は非同期のattrbuteをサポートする他の多くのブラウザを信じています。これはインラインブロックがifブロック内のコードを時間の一部だけ実行する結果となります。ドキュメントには、「タグは非同期であり、ページの読み込みが遅くならない」と記載されています。

<script type="text/javascript" src="LOADER_URL" async="true"></script> 
<script type="text/javascript"> 
if (typeof (OBJECT_DEFINED_IN_LOADER_URL) != "undefined") { OBJECT_DEFINED_IN_LOADER_URL.Load(false); } 
</script> 

ドキュメントの以前のバージョンを見ると、async属性の提案はなく、この主張はしませんでした。テクニカルライターが間違いを犯して、すべてのブラウザで適切にテストすることなく "うまくいく"と言ったのですか? IE < = 9では常に動作します。そして、非同期コードをデバッグするユーバー-楽しいですので、...多分それは彼らのために働いていた...

私の疑惑だこと:)

+0

任意のコードを共有したい:

は、私は外部スクリプトを呼び出すために、これまでの任意のブラウザでこのコードを自分のサイトには何の問題を発見したん? –

+2

私はltsとgtsを逃れるのを忘れて、怒っているデータエスケープモンスターが私のタグを食べました。 –

+0

@ JaimieSirovichの場合、コードを4つのスペースでインデントするだけで、すべての文字が自動的にエスケープされます。私は今あなたのためにそれを修正しました。 – Dogbert

答えて

3

「真の非同期=」、ブラウザによってサポートされている場合、基本的には意味:ブラウザがしますスクリプトを非同期に読み込み、好きなときに実行します。
したがって、最初のスクリプトの後に2番目のスクリプトが実行される保証はありません。

「asynch js load」は、asynchスクリプトでロードしているオブジェクトを直接使用する他のコードがページにない場合にのみ安全に使用できます。

プロジェクトの1つで同様のエラーが発生したため、すべての証拠がありますが、フィドラーなどで複製するのは簡単ではありません。

質問で提案されているコードは、いつかはい、時にはうまくいきません。

+0

async = trueは有効な構文ではありません。 Asyncを使用してIE10以上で有効にするだけです。 ソース:http://www.w3.org/html/wg/drafts/html/master/scripting-1.html – user1491819

+0

@ user1491819ページはhttp://w3c.github.io/html-reference/に移動しましたscript.html - 正しい構文は 'async'属性ではなく、async'自体(HTML)、' async = async "(HTMLとXML)です。これは、ほとんどのブール属性がHTMLで動作することです。残念なことに、真実または偽を受け入れる属性を導入する人もいます。それはすべてのことを混乱させます。 –

7

あなたは疑わしいと正しかったです。投稿されたコードは、async属性をサポートしているブラウザで意図したとおりに動作しないことがほとんど保証されています。

は、基本的には3「モードが」あります

  1. 非同期属性が存在する場合、スクリプトは、すぐにそれが利用可能であるとして、非同期で実行されます。
  2. async属性は存在しないが、defer属性が存在する場合、ページの解析が完了するとスクリプトが実行されます。
  3. 属性が存在しない場合、ユーザーエージェントがページの解析を続行する前に、スクリプトがフェッチされてすぐに実行されます。

出典:http://www.w3.org/html/wg/drafts/html/master/scripting-1.html

注:非同期属性値が無視され、属性の単なる存在は、スクリプトが非同期で実行されなければならないことを示しています。したがって、値をfalseに設定することは、それをtrueに設定することと同じです。非同期がtrueの場合

2

スクリプトが可能とHTMLページとすぐにダウンロードしてexecuteedされます

非同期の場合に同時に

パースされますが

プロセス偽でありますスクリプトのダウンロードと実行はHTMLページ解析の開始前に実行されるため、スクリプトが最初にダウンロードされて実行されている間はHTMLの一時停止は停止します。

0

これが意味を成すかどうかは、コードの構造に大きく依存します。

ブラウザには特定のファイル(これにはスクリプトが含まれます)がキャッシュされることに注意してください。あなたのスクリプトは、要求に応じて必要なリソース(おそらくrequire.jsのようなもの)を読み込む何らかのライブラリのようです。この非同期コードは、ブラウザにキャッシュ内のすべてのもの(=オブジェクトがすでに存在している)ロードプロセス。

0

説明したように、HTML5の新機能です。非同期属性が値として 'async'によって割り当てられます。非同期で実行されるスクリプト(外部スクリプトのみ)を指定します。

function include(src, attr, value) 
{ 
    var head = document.getElementsByTagName('head')[0]; 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.setAttribute(attr, value); 
    script.async = 'async'; 
    script.src = src; 
    head.appendChild(script); 
} 

include('LOADER_URL', 'custom-attr', 'custom-value'); 
関連する問題