ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript の実行順序を保証する方法 - Chapter_JavaScript の実践スキル

JavaScript の実行順序を保証する方法 - Chapter_JavaScript の実践スキル

WBOY
WBOYオリジナル
2016-05-16 18:09:59961ブラウズ
1. はじめに
JavaScript の逐次実行機能については「複数のページで同じ HTML フラグメントを使用する方法 - 続き」の最後で説明しました。最近のブラウザでは JavaScript を並行してダウンロードできますが (一部のブラウザ)、JavaScript の依存関係を考慮して、実行は依然として導入された順序で実行されます。
このプロセスをより適切にテストするために、次の 2 つのパラメーターを受け入れることができる単純な HTTP ハンドラー ページ service.ashx を作成しました。
1. ファイルのサーバー側のパスを返す必要があります。
2. 遅延、この HTTP リクエストを返すまでの一定時間の遅延 (ミリ秒)。
次のような一般的なページ: ./service.ashx?file=js/jquery-ui.js&lay=2000 は、サーバー側の js/jquery-ui.js ファイルに戻るまでに 2 秒の遅延を意味します。
service.ashx のキー コードは次のとおりです:
コードをコピーします コードは次のとおりです:

public void ProcessRequest(HttpContext context)
{
int late = 0;
if (!String.IsNullOrEmpty(context.Request["delay"]))
{
遅延 = Convert.ToInt32 (context.Request["遅延"]);
}
if (遅延 > 0)
{
System.Threading.Thread.Sleep(1000); 🎜>}
string filePath = context.Request["file"].ToString();
string fileContent = String.Empty; using (StreamReader sr = new StreamReader(context.Server.MapPath(filePath) )))
{
fileContent = sr.ReadToEnd();
}
if (filePath.EndsWith(".js"))
{
context.Response.ContentType = "application/x-javascript ";
}
else
{
context.Response.ContentType = "text/plain";
context.Response.Write(fileContent) ;
}



2. script タグを使用して JavaScript (test1.htm) を直接導入します。まず、JavaScript を順次導入する状況を分析します。 タグ。 test1.htm のページのソース コードは次のとおりです:


コードをコピー
コードは次のとおりです:


<script> <br>function addScript(url, inline) { <br>var head = document.getElementsByTagName("head")[0]; <br> var script = document.createElement ('script'); <br>script.type = 'text/javascript'; <br>if (インライン) { <br>script.text = url; <br> >script.src = url ; <br>} <br>head.appendChild(script); <br>$(function () { <br>addScript('./service.ashx?file=js/ jquery-ui.js&delay= 2000'); <br>addScript('alert(typeof(jQuery.ui));', <br>}); <br></script> /head>




我们分别在各种浏览器中测试这个例子:
test3.htm
通过JavaScript添加<script>标签 <br> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN-LEFT: 10.5pt; BORDER-LEFT: medium none; WIDTH: 413.1pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="689" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 67.25pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="112"> <p align="left"><span>Firefox 3.6</span></p> </td> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 345.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="576"> <p align="left"><img style="max-width:90%" alt="" src="http://files.jb51.net/upload/201103/20110303231405311.gif" style="max-width:90%" border="0"></p> </td> </tr> <tr> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 67.25pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="112"> <p align="left">IE 8</p> </td> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 345.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="576"> <p align="left"><img style="max-width:90%" alt="" src="http://files.jb51.net/upload/201103/20110303231407246.gif" style="max-width:90%" border="0"></p> </td> </tr> <tr> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 67.25pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="112"> <p align="left"><span>Chrome 10</span></p> </td> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 345.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="576"> <p align="left"><img style="max-width:90%" alt="" src="http://files.jb51.net/upload/201103/20110303231407150.gif" style="max-width:90%" border="0"></p> </td> </tr> <tr> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 67.25pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="112"> <p align="left"><span>Safari 4</span></p> </td> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 345.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="576"> <p align="left"><img style="max-width:90%" alt="" src="http://files.jb51.net/upload/201103/20110303231407465.jpg" style="max-width:90%" border="0"></p> </td> </tr> <tr> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 67.25pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="112"> <p align="left"><span>Opera 11</span></p> </td> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 345.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="576"> <p align="left"><img style="max-width:90%" alt="" src="http://files.jb51.net/upload/201103/20110303231406793.gif" style="max-width:90%" border="0"></p> </td> </tr> </tbody> </table> <p align="left"><span style="FONT-FAMILY: 宋体"></span>DOM<span style="FONT-FAMILY: 宋体"> がロードされた後に </span>JavaScript<span style="FONT-FAMILY: 宋体"> が導入され、その後外部またはインラインの </span>JavaScript<span style="FONT-FAMILY: 宋体"> が導入されると、</span>Firefox が実行されることがわかります。 <span style="FONT-FAMILY: 宋体"> と </span>Opera<span style="FONT-FAMILY: 宋体"> の動作は一貫しており、</span>JavaScript<span style="FONT-FAMILY: 宋体"> の実行順序が導入順序と一致していることが保証されます。ただし、</span>IE8、Chrome、Safari <span style="FONT-FAMILY: 宋体"> では、この実行順序は保証できません。 </span></p> <p><span style="FONT-FAMILY: 宋体">実行順序の確保はブラウザによって異なりますが、現時点での最大の利点は、複数の </span>JavaScript<span style="FONT-FAMILY: 宋体"> ファイルを並行してダウンロードでき、すべてのブラウザで一貫して動作することです。もちろん、これはこの記事の主題ではありません。</span><a href="http://www.google.com/search?q=javascript%20parallel%20download">Google<span style="FONT-FAMILY: 宋体"><span>で詳細を確認できます</span></span></a><span style="FONT-FAMILY: 宋体">。 </span></p> <p><span style="FONT-FAMILY: 宋体">ブラウザ間の不一致を解決する方法。以下に 2 つの解決策を示します。 <br><strong>4. 解決策 1、スクリプト タグを動的に追加するときに実行順序を確保する方法 <br></strong>ページ ロジックでは、上記のメソッドを通じて JavaScript を動的に実行する必要があるため、すべてのブラウザーで実行順序を保証する方法 (現在、実行順序を保証しているのは Firefox と Opera のみ)。 <br>実際、解決策は非常に簡単で、関数を実行するための完全なコールバック関数を追加するだけです。次の test4.htm は具体的な解決策を示しています: <br><div class="codetitle"> <span><a style="CURSOR: pointer" data="768" class="copybut" id="copybut768" onclick="doCopy('code768')"><u>コードをコピー</u></a></span> コードは次のとおりです:</div> <div class="codebody" id="code768"> <br><html> <br><head> <br><title></title> <br><script src="./js/jquery-1.4.4.js" type="text/ javascript"></script>
<script> <br>function addScript(url, inline, callback) { <br>var head = document.getElementsByTagName("head")[0]; <br> var script = document.createElement('script'); <br>script.type = 'text/javascript'; <br>if (インライン) { <br>script.text = url; <br> >script.src = url; <br>script.onload = script.onreadystatechange = function () { <br>if (!script.readyState || script.readyState === 'ロード済み' || script.readyState === '完了') { <br>if (コールバック) { <br>} <br>script.onload = script.onreadystatechange = null; <br>head.appendChild(script); <br>if (インライン && コールバック) { <br>callback(); <br>$(function () { <br>addScript() './service.ashx?file=js/jquery-ui.js&lay=2000', false, function () { <br>addScript('alert(typeof(jQuery.ui));', true); }); <br>}); <br> <br><body> <br> <br> /div><br><br><br> <br>此时所有浏览器中的行为一致: <br>test4.htm <br>通过回调函数解决动态添加JavaScript的顺序问题 <br> <table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN-LEFT: 10.5pt; BORDER-LEFT: medium none; WIDTH: 413.1pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="689" border="1"> <tbody> <tr> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 67.25pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="112"> <p align="left"><span>Firefox 3.6</span></p> </td> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 345.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="576"> <p align="left"><img style="max-width:90%" alt="" src="http://files.jb51.net/upload/201103/20110303231405311.gif" style="max-width:90%" border="0"></p> </td> </tr> <tr> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 67.25pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="112"> <p align="left">IE 8</p> </td> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 345.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="576"> <p align="left"><img style="max-width:90%" alt="" src="http://files.jb51.net/upload/201103/20110303231405966.gif" style="max-width:90%" border="0"></p> </td> </tr> <tr> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 67.25pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="112"> <p align="left"><span>Chrome 10</span></p> </td> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 345.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="576"> <p align="left"><img style="max-width:90%" alt="" src="http://files.jb51.net/upload/201103/20110303231406914.gif" style="max-width:90%" border="0"></p> </td> </tr> <tr> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 67.25pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="112"> <p align="left"><span>Safari 4</span></p> </td> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 345.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="576"> <p align="left"><img style="max-width:90%" alt="" src="http://files.jb51.net/upload/201103/20110303231406397.jpg" style="max-width:90%" border="0"></p> </td> </tr> <tr> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 67.25pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="112"> <p align="left"><span>Opera 11</span></p> </td> <td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 345.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="576"> <p align="left"><img style="max-width:90%" alt="" src="http://files.jb51.net/upload/201103/20110303231406793.gif" style="max-width:90%" border="0"></p> </td> </tr> </tbody> </table> <br><strong>5. 方案二,使用jQuery的html函数动态添加JavaScript <br></strong>jQuery的html函数用来更新一个DOM片段,我们可以很方便的通过这个函数来动态加载JavaScript,请看示例test2.htm: <br><div class="codetitle"> <span><a style="CURSOR: pointer" data="82205" class="copybut" id="copybut82205" onclick="doCopy('code82205')"><u>复制代码</u></a></span> 代码如下:</div> <div class="codebody" id="code82205"> <br><html> <br><head> <br><title></title> <br><script src="js/jquery-1.4.4.js" type="text/javascript"></script>
<script> <br>$(function(){ <br>$('#container').html('<script src="./service.ashx?file=js/jquery-ui.js&delay=2000" type="text\/javascript"><\/script>' + '<script>alert(typeof(jQuery.ui));<\/script>'); <br>}); <br></script>







此时,各个浏览器中的行为一致:
test2.htm
通过jQuery的html函数解决动态添加JavaScript的顺序问题

Firefox 3.6

IE 8

Chrome 10

Safari 4

Opera 11


6. Postscript
Why can jQuery’s html function ensure the execution order of dynamically loaded JavaScript?
We know that updating the DOM node by simply .innerHTML will not allow the JavaScript in it to be executed. We can simply change the source code of this example to:
$('#container')[0] .innerHTML = '' '<script>alert( typeof(jQuery.ui));</script>';
In this case jQueryUI will not load at all.
So how does jQuery do it? In the next article, we will trace the source and analyze the jQuery source code in detail, please continue browsing: How to ensure the execution order of JavaScript – In-depth analysis of jQuery.html

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:jQuery_jquery に基づくタブ オプション ボックス効果コード (プラグイン)次の記事:jQuery_jquery に基づくタブ オプション ボックス効果コード (プラグイン)

関連記事

続きを見る