あなたのサンプルによると、
<html>
<head>
<script src="jquery.js" type="text/javascript"></script>
<script src="abc.js" type="text/javascript">
</script>
<link rel="stylesheets" type="text/css" href="abc.css"></link>
<style>h2{font-wight:bold;}</style>
<script>
$(document).ready(function(){
$("#img").attr("src", "kkk.png");
});
</script>
</head>
<body>
<img id="img" src="abc.jpg" style="width:400px;height:300px;"/>
<script src="kkk.js" type="text/javascript"></script>
</body>
</html>
おおよその実行フローは次のとおりです。
- HTMLドキュメントがダウンロードされます
- HTMLドキュメントの解析が始まります
- HTML解析の範囲
<script src="jquery.js" ...
jquery.js
ダウンロードされて解析されます
- HTML解析範囲
<script src="abc.js" ...
abc.js
ダウンロード、解析、実行
- HTML解析範囲
<link href="abc.css" ...
abc.css
ダウンロードされて解析されます
- HTML解析範囲
<style>...</style>
- 内部CSSルールが解析および定義されます
- HTML解析範囲
<script>...</script>
- 内部Javascriptが解析されて実行されます
- HTML解析の範囲
<img src="abc.jpg" ...
abc.jpg
ダウンロードして表示されます
- HTML解析の範囲
<script src="kkk.js" ...
kkk.js
ダウンロード、解析、実行
- HTMLドキュメントの解析が終了しました
ブラウザの動作により、ダウンロードが非同期でブロックされない場合があることに注意してください。たとえば、Firefoxでは、ドメインごとの同時リクエスト数を制限するこの設定があります。
また、コンポーネントがすでにキャッシュされているかどうかによって、近い将来のリクエストでコンポーネントが再度リクエストされない場合があります。コンポーネントがキャッシュされている場合、コンポーネントは実際のURLではなくキャッシュからロードされます。
解析が終了し、ドキュメントが準備されて読み込まれると、イベントonload
が発生します。したがって、onload
が起動されると、$("#img").attr("src","kkk.png");
が実行されます。そう:
- ドキュメントの準備が整い、onloadが発生します。
- JavaScript実行ヒット
$("#img").attr("src", "kkk.png");
kkk.png
ダウンロードされてロードされます #img
この$(document).ready()
イベントは、実際には、すべてのページコンポーネントが読み込まれて準備ができたときに発生するイベントです。詳細については、http://docs.jquery.com/Tutorials:Introducing_ $(document).ready()をご覧ください。
編集-この部分は、平行部分または非部分について詳しく説明します。
デフォルトでは、私の現在の理解から、ブラウザーは通常、各ページをHTMLパーサー、JavaScript / DOM、CSSの3つの方法で実行します。
HTMLパーサーは、マークアップ言語の解析と解釈を担当するため、他の2つのコンポーネントを呼び出すことができる必要があります。
たとえば、パーサーがこの行に遭遇した場合:
<a href="#" onclick="alert('test');return false;" style="font-weight:bold">a hypertext link</a>
パーサーは2つのJavaScriptと1つのCSSへの3つの呼び出しを行います。最初に、パーサーはこの要素を作成し、この要素に関連するすべての属性とともにDOM名前空間に登録します。次に、パーサーはonclickイベントをこの特定の要素にバインドするために呼び出します。最後に、CSSスレッドをもう一度呼び出して、この特定の要素にCSSスタイルを適用します。
実行はトップダウンで、シングルスレッドです。JavaScriptはマルチスレッドに見えるかもしれませんが、実際のところ、JavaScriptはシングルスレッドです。これが、外部JavaScriptファイルをロードするときに、メインHTMLページの解析が一時停止される理由です。
ただし、CSSルールは常に適用されているため、CSSファイルは同時にダウンロードできます。つまり、要素は常に定義された最新のCSSルールで再描画されるため、ブロックが解除されます。
要素は、解析後にDOMでのみ使用できます。したがって、特定の要素を操作する場合、スクリプトは常にウィンドウのonloadイベントの後、またはウィンドウ内に配置されます。
次のようなスクリプトはエラーを引き起こします(jQueryで):
<script type="text/javascript">/* <![CDATA[ */
alert($("#mydiv").html());
/* ]]> */</script>
<div id="mydiv">Hello World</div>
スクリプトが解析されるとき、#mydiv
要素はまだ定義されていないためです。代わりにこれはうまくいくでしょう:
<div id="mydiv">Hello World</div>
<script type="text/javascript">/* <![CDATA[ */
alert($("#mydiv").html());
/* ]]> */</script>
または
<script type="text/javascript">/* <![CDATA[ */
$(window).ready(function(){
alert($("#mydiv").html());
});
/* ]]> */</script>
<div id="mydiv">Hello World</div>