最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何確保JavaScript的執(zhí)行順序 之實(shí)戰(zhàn)篇

 更新時(shí)間:2011年03月03日 22:53:12   作者:  
我曾在文章《如何在多個(gè)頁面使用同一個(gè)HTML片段 - 續(xù)》的最后提到JavaScript順序執(zhí)行的特性。雖然現(xiàn)代瀏覽器可以并行的下載JavaScript(部分瀏覽器),但考慮到JavaScript的依賴關(guān)系,他們的執(zhí)行依然是按照引入順序進(jìn)行的。
1. 引言
我曾在文章《如何在多個(gè)頁面使用同一個(gè)HTML片段 - 續(xù)》的最后提到JavaScript順序執(zhí)行的特性。雖然現(xiàn)代瀏覽器可以并行的下載JavaScript(部分瀏覽器),但考慮到JavaScript的依賴關(guān)系,他們的執(zhí)行依然是按照引入順序進(jìn)行的。
為了更好的測試這個(gè)過程,我寫了一個(gè)簡單的HTTP處理程序頁面 service.ashx,它可以接受兩個(gè)參數(shù):
1. file,需要返回文件的服務(wù)器端路徑。
2. delay,延遲一定時(shí)間后再返回本次HTTP請求(毫秒)。
一個(gè)典型的頁面比如:./service.ashx?file=js/jquery-ui.js&delay=2000,表示延遲2秒鐘后再返回服務(wù)器端的js/jquery-ui.js文件。
service.ashx 的關(guān)鍵代碼如下:
復(fù)制代碼 代碼如下:

public void ProcessRequest(HttpContext context)
{
int delay = 0;
if (!String.IsNullOrEmpty(context.Request["delay"]))
{
delay = Convert.ToInt32(context.Request["delay"]);
}
if (delay > 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標(biāo)簽直接引入JavaScript(test1.htm)
首先我們分析下在<head>標(biāo)簽中順序引入JavaScript的情況。test1.htm的頁面源代碼如下:
復(fù)制代碼 代碼如下:

<html>
<head>
<title></title>
<script src="./js/jquery-1.4.4.js"
type="text/javascript"></script>
<script src="./service.ashx?file=js/jquery-ui.js&delay=2000"
type="text/javascript"></script>
<script>
alert(typeof (jQuery.ui));
</script>
</head>
<body>
</body>
</html>

我們分別在各種瀏覽器中測試這個(gè)例子:
test1.htm
通過script標(biāo)簽直接引入JavaScript

Firefox 3.6

IE 8

Chrome 10

Safari 4

Opera 11

 

可以看出各個(gè)主流瀏覽器的行為一致。雖然jQueryUI在服務(wù)器延遲了2秒鐘再返回,但是后引入的內(nèi)聯(lián)JavaScript還是等待了2秒,等前面引入的JavaScript執(zhí)行完畢才執(zhí)行。這也是著名的JavaScript順序執(zhí)行的特性。
3. 通過JavaScript添加script標(biāo)簽(test3.htm)
我們首先定義一個(gè)addScript函數(shù),用來引入外部或者內(nèi)聯(lián)JavaScript。test3.htm的頁面源代碼如下:

復(fù)制代碼 代碼如下:

<html>
<head>
<title></title>
<script src="./js/jquery-1.4.4.js" type="text/javascript"></script>
<script>
function addScript(url, inline) {
var head = document.getElementsByTagName("head")[0];
var script = document.createElement('script');
script.type = 'text/javascript';
if (inline) {
script.text = url;
} else {
script.src = url;
}
head.appendChild(script);
}
$(function () {
addScript('./service.ashx?file=js/jquery-ui.js&delay=2000');
addScript('alert(typeof(jQuery.ui));', true);
});
</script>
</head>
<body>
<div id="container">
</div>
</body>
</html>

我們分別在各種瀏覽器中測試這個(gè)例子:
test3.htm
通過JavaScript添加<script>標(biāo)簽

Firefox 3.6

IE 8

Chrome 10

Safari 4

Opera 11

可見,通過JavaScriptDOM加載完畢后再引入外部或者內(nèi)聯(lián)JavaScript時(shí),FirefoxOpera的行為一致,能夠確保JavaScript的執(zhí)行順序和引入順序一致。但是IE8, Chrome, Safari 卻不能保證這個(gè)執(zhí)行順序。

雖然各種瀏覽器在確保執(zhí)行順序方面不盡相同,不過這時(shí)的最大好處是多個(gè)JavaScript文件能夠并行下載,這在所有瀏覽器中行為一致。當(dāng)然這不是這篇文章的主題,可以Google更多細(xì)節(jié)

如何解決各個(gè)瀏覽器的不一致性,下面提供了兩個(gè)解決方案:
4. 方案一,如何在動(dòng)態(tài)添加script標(biāo)簽時(shí)確保執(zhí)行順序
有時(shí)頁面邏輯要求我們必須通過上面的方式動(dòng)態(tài)執(zhí)行JavaScript,那么如何確保所有瀏覽器下的執(zhí)行順序(目前只有Firefox和Opera確保執(zhí)行順序)。
其實(shí)解決方案很簡單,我們?yōu)楹瘮?shù)執(zhí)行添加一個(gè)complete的回調(diào)函數(shù)就行了。下面的test4.htm給出了具體的解決方案:

復(fù)制代碼 代碼如下:

<html>
<head>
<title></title>
<script src="./js/jquery-1.4.4.js" type="text/javascript"></script>
<script>
function addScript(url, inline, callback) {
var head = document.getElementsByTagName("head")[0];
var script = document.createElement('script');
script.type = 'text/javascript';
if (inline) {
script.text = url;
} else {
script.src = url;
script.onload = script.onreadystatechange = function () {
if (!script.readyState || script.readyState === 'loaded' || script.readyState === 'complete') {
if (callback) {
callback();
}
script.onload = script.onreadystatechange = null;
};
};
}
head.appendChild(script);
if (inline && callback) {
callback();
}
}
$(function () {
addScript('./service.ashx?file=js/jquery-ui.js&delay=2000', false, function () {
addScript('alert(typeof(jQuery.ui));', true);
});
});
</script>
</head>
<body>
<div id="container">
</div>
</body>
</html>

此時(shí)所有瀏覽器中的行為一致:
test4.htm
通過回調(diào)函數(shù)解決動(dòng)態(tài)添加JavaScript的順序問題

Firefox 3.6

IE 8

Chrome 10

Safari 4

Opera 11


5. 方案二,使用jQuery的html函數(shù)動(dòng)態(tài)添加JavaScript
jQuery的html函數(shù)用來更新一個(gè)DOM片段,我們可以很方便的通過這個(gè)函數(shù)來動(dòng)態(tài)加載JavaScript,請看示例test2.htm:
復(fù)制代碼 代碼如下:

<html>
<head>
<title></title>
<script src="js/jquery-1.4.4.js" type="text/javascript"></script>
<script>
$(function(){
$('#container').html('<script src="./service.ashx?file=js/jquery-ui.js&delay=2000" type="text\/javascript"><\/script>' + '<script>alert(typeof(jQuery.ui));<\/script>');
});
</script>
</head>
<body>
<div id="container">
</div>
</body>
</html>

此時(shí),各個(gè)瀏覽器中的行為一致:
test2.htm
通過jQuery的html函數(shù)解決動(dòng)態(tài)添加JavaScript的順序問題

Firefox 3.6

IE 8

Chrome 10

Safari 4

Opera 11


6. 后記
為什么jQuery的html函數(shù)能夠確保動(dòng)態(tài)加載JavaScript的執(zhí)行順序呢?
我們知道通過簡單的 .innerHTML 更新DOM節(jié)點(diǎn),是不會(huì)讓其中的JavaScript的執(zhí)行,我們可以簡單的把這個(gè)例子的源代碼改成:
$('#container')[0].innerHTML = '<script src="./service.ashx?file=js/jquery-ui.js&delay=2000" type="text\/javascript"><\/script>' + '<script>alert(typeof(jQuery.ui));<\/script>';
這種情況下jQueryUI根本不會(huì)加載。
那么jQuery是如果做到的呢?下篇文章我們會(huì)追根溯源,詳細(xì)分析jQuery源代碼,請繼續(xù)瀏覽: 如何確保JavaScript的執(zhí)行順序 – 之jQuery.html深度分析

相關(guān)文章

  • js實(shí)現(xiàn)二代身份證號碼驗(yàn)證詳解

    js實(shí)現(xiàn)二代身份證號碼驗(yàn)證詳解

    本文給大家分享一段超級全面的二代身份證號碼驗(yàn)證程序,由JS編寫而成,可以校驗(yàn)身份證的地址碼、出生日期碼、順序碼和數(shù)字校驗(yàn)碼。是身份證去偽存真的一大利器。
    2014-11-11
  • RxJS中四種Subject的用法和區(qū)別

    RxJS中四種Subject的用法和區(qū)別

    RxJS中有四種不同類型的Subject,它們分別是Subject、BehaviorSubject、ReplaySubject和AsyncSubject,本文將介紹這四種Subject的用法、區(qū)別以及適用的應(yīng)用場景,并提供代碼示例,需要的朋友可以參考下
    2023-07-07
  • JavaScript實(shí)現(xiàn)文本中間縮略的兩種方案

    JavaScript實(shí)現(xiàn)文本中間縮略的兩種方案

    項(xiàng)目中經(jīng)常會(huì)遇到縮略展示文字的場景,即要求文字在一行不換行展示,超出自動(dòng)展示...,常用的展示效果有兩種,文字中間縮略以及文字末尾縮略,本文將通過代碼示例給大家詳細(xì)的講一下這兩種方案,需要的朋友可以參考下
    2024-06-06
  • echarts折線圖流動(dòng)特效的實(shí)現(xiàn)全過程(非平滑曲線)

    echarts折線圖流動(dòng)特效的實(shí)現(xiàn)全過程(非平滑曲線)

    最近因?yàn)楣緲I(yè)務(wù)需求,需要實(shí)現(xiàn),當(dāng)Echarts重新加載數(shù)據(jù)時(shí)實(shí)現(xiàn)動(dòng)態(tài)效果,下面這篇文章主要給大家介紹了關(guān)于echarts折線圖流動(dòng)特效實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Bootstrap導(dǎo)航欄各元素操作方法(表單、按鈕、文本)

    Bootstrap導(dǎo)航欄各元素操作方法(表單、按鈕、文本)

    這篇文章主要介紹了Bootstrap導(dǎo)航欄各元素操作方法,針對表單、按鈕、文本進(jìn)行操作,感興趣的小伙伴們可以參考一下
    2015-12-12
  • javascript對下拉列表框(select)的操作實(shí)例講解

    javascript對下拉列表框(select)的操作實(shí)例講解

    這篇文章主要介紹了javascript對下拉列表框(select)的操作。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-11-11
  • 微信小程序中子頁面向父頁面?zhèn)髦祵?shí)例詳解

    微信小程序中子頁面向父頁面?zhèn)髦祵?shí)例詳解

    這篇文章主要介紹了微信小程序中子頁面向父頁面?zhèn)髦祵?shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Bootstrap 填充Json數(shù)據(jù)的實(shí)例代碼

    Bootstrap 填充Json數(shù)據(jù)的實(shí)例代碼

    本篇文章主要介紹了Bootstrap 填充Json數(shù)據(jù)的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • js中常用的4種模糊查詢詳解(includes()、indexOf()、search()、match())

    js中常用的4種模糊查詢詳解(includes()、indexOf()、search()、match())

    這篇文章主要給大家介紹了關(guān)于js中常用的4種模糊查詢(includes()、indexOf()、search()、match())的相關(guān)資料,搜索可以使我們更快的找到某一個(gè)關(guān)鍵詞或者某一個(gè)商品,所以模糊查詢和下拉匹配也成了前端必備的一個(gè)小技能,需要的朋友可以參考下
    2023-11-11
  • js驗(yàn)證真實(shí)姓名與身份證號是否匹配

    js驗(yàn)證真實(shí)姓名與身份證號是否匹配

    使用javascript技術(shù)驗(yàn)真實(shí)姓名,要用到unicode字符來匹配,由于中國人的姓名長度一般是在2-4這個(gè)范圍內(nèi),所以重復(fù)匹配{2,4}次。接下來,通過本文給大家分享js驗(yàn)證省份證號與真實(shí)姓名是否匹配,需要的朋友可以參考下
    2015-10-10

最新評論

巨鹿县| 皋兰县| 玉屏| 苏州市| 秭归县| 黔江区| 仙居县| 冀州市| 承德县| 大足县| 孝昌县| 宜章县| 建湖县| 新巴尔虎右旗| 丰顺县| 淄博市| 南投市| 沙洋县| 扶余县| 大竹县| 娱乐| 垫江县| 房山区| 顺昌县| 琼中| 曲周县| 中阳县| 额尔古纳市| 湖南省| 黄陵县| 兴隆县| 刚察县| 玛曲县| 衡南县| 西宁市| 辰溪县| 偏关县| 社旗县| 永宁县| 临澧县| 霍林郭勒市|