如何確保JavaScript的執(zhí)行順序 之jQuery.html深度分析
我們先來(lái)簡(jiǎn)單回顧下HTML源代碼(test2.htm):
<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>
2.調(diào)試,單步跟進(jìn)
逐行分析jQuery源代碼是一件相當(dāng)枯燥的事情。我這里會(huì)以test2.htm為目標(biāo),調(diào)試進(jìn)入jQuery源代碼。
1) 首先在html: 打一個(gè)斷點(diǎn),刷新頁(yè)面

這里的value是字符串:"<script src="./service.ashx?file=js/jquery-ui.js&delay=2000" type="text/javascript"></script><script>alert(typeof(jQuery.ui));</script>"
我們來(lái)看會(huì)進(jìn)入那個(gè)條件分支:首先看看rnocache是啥?

可見(jiàn)value中含有 <script 字符串,不會(huì)進(jìn)入第二個(gè)條件分支。
2) 進(jìn)入html函數(shù)的最后一個(gè)條件分支

來(lái)看看append函數(shù):
3) 進(jìn)入domManip函數(shù)
繼續(xù)單步調(diào)試,發(fā)現(xiàn)目標(biāo),這里有對(duì)scripts的長(zhǎng)度判斷:
應(yīng)該是已經(jīng)分析了輸入字符串,并提取了其中的script標(biāo)簽,我們來(lái)看下這里的局部變量scripts的內(nèi)容:
4)發(fā)現(xiàn)目標(biāo)
這里的兩個(gè)局部變量scripts和evalScript是我們重點(diǎn)需要關(guān)注的,我們分別來(lái)看下:
scripts,這是一個(gè)數(shù)組,包含兩個(gè)script標(biāo)簽:
[<script src="./service.ashx?file=js/jquery-ui.js&delay=2000" type="text/javascript"></script>
, <script>alert(typeof(jQuery.ui));</script>]
evalScript,這是一個(gè)函數(shù),通過(guò)jQuery.each函數(shù)來(lái)調(diào)用,上述數(shù)組中的每個(gè)值都會(huì)作為參數(shù)傳到這個(gè)函數(shù)中執(zhí)行:
function evalScript( i, elem ) {
if ( elem.src ) {
jQuery.ajax({
url: elem.src,
async: false,
dataType: "script"
});
} else {
jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
}
if ( elem.parentNode ) {
elem.parentNode.removeChild( elem );
}
}
3. 哦,明白了
通過(guò)上面的分析,我們清楚的看到j(luò)Query.html函數(shù)會(huì)首先把其中的script檢索出來(lái),然后對(duì)于每個(gè)script標(biāo)簽應(yīng)用evalScript函數(shù)。
在這個(gè)函數(shù)中,對(duì)于外部JavaScript個(gè)內(nèi)聯(lián)JavaScript,進(jìn)行了不同的處理。
1)jQuery.html如何處理字符串中的外部script標(biāo)簽
jQuery.ajax({
url: elem.src,
async: false,
dataType: "script"
});
對(duì)于外部script標(biāo)簽,比如:<script src="./service.ashx?file=js/jquery-ui.js&delay=2000" type="text/javascript"></script>,jQuery采用了同步Ajax方案(async: false)。這也是在各種不同瀏覽器中能夠保證動(dòng)態(tài)JS的加載順序的關(guān)鍵所在。
2)jQuery.html如何處理字符串中的內(nèi)聯(lián)script標(biāo)簽
jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
來(lái)看下globalEval函數(shù)的定義:
由此可見(jiàn),對(duì)于內(nèi)聯(lián)的script標(biāo)簽,jQuery通過(guò)在head中創(chuàng)建script標(biāo)簽來(lái)執(zhí)行。
4. 后記
目前來(lái)看,一切來(lái)龍去脈似乎清晰可見(jiàn)。那么大家有沒(méi)有考慮過(guò),如果動(dòng)態(tài)加載加載不同域名下(Cross-Domain)的JavaScript文件,jQuery還能確保在所有瀏覽器下的JavaScript的執(zhí)行順序嗎?
也就是說(shuō)在當(dāng)前流行的靜態(tài)資源的CDN加速情況下,jQuery.html是不是一個(gè)完全之策呢?
請(qǐng)看下篇 如何確保JavaScript的執(zhí)行順序 - 之jQuery.html并非萬(wàn)能鑰匙。待續(xù)。。。
- 淺談js在html中的加載執(zhí)行順序,多個(gè)jquery ready執(zhí)行順序
- 簡(jiǎn)述jQuery ajax的執(zhí)行順序
- jquery中ajax函數(shù)執(zhí)行順序問(wèn)題之如何設(shè)置同步
- Jquery ajax執(zhí)行順序 返回自定義錯(cuò)誤信息(實(shí)例講解)
- jQuery中(function(){})()執(zhí)行順序的理解
- jquery $.ajax各個(gè)事件執(zhí)行順序
- jQuery中triggerHandler()方法用法實(shí)例
- jquery的trigger和triggerHandler的區(qū)別示例介紹
- jQuery事件模型默認(rèn)行為執(zhí)行順序及trigger()與 triggerHandler()比較實(shí)例分析
相關(guān)文章
jQuery Easyui Tabs擴(kuò)展根據(jù)自定義屬性打開(kāi)頁(yè)簽
這篇文章主要介紹了jQuery Easyui Tabs擴(kuò)展根據(jù)自定義屬性打開(kāi)頁(yè)簽的實(shí)現(xiàn)代碼,首先增加擴(kuò)展,接著點(diǎn)擊事件open方法實(shí)現(xiàn)easyui tabs擴(kuò)展,非常不錯(cuò),需要的朋友可以參考下2016-08-08jQuery學(xué)習(xí)筆記之jQuery.extend(),jQuery.fn.extend()分析
給jQuery做過(guò)擴(kuò)展或者制作過(guò)jQuery插件的人這兩個(gè)方法東西可能不陌生. jQuery.extend([deep],target,object1,,object2...[objectN]) jQuery.fn.extend([deep],target,object1,,object2...[objectN]) 這兩個(gè)屬性都是用于合并兩個(gè)或多個(gè)對(duì)象的屬性到target對(duì)象.2014-06-06jQuery實(shí)現(xiàn)Email郵箱地址自動(dòng)補(bǔ)全功能代碼
這篇文章主要介紹了jQuery實(shí)現(xiàn)Email郵箱地址自動(dòng)補(bǔ)全功能代碼,涉及jQuery鼠標(biāo)事件及字符操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11推薦8款jQuery輕量級(jí)樹(shù)形Tree插件
這篇文章主要給大家推薦8款jQuery輕量級(jí)樹(shù)形Tree插件,需要的朋友可以參考下2014-11-11jQuery獲取訪問(wèn)者IP地址的方法(基于新浪API與QQ查詢(xún)接口)
這篇文章主要介紹了jQuery獲取訪問(wèn)者IP地址的方法,實(shí)例分析了jQuery基于新浪API與QQ查詢(xún)接口獲取來(lái)訪者IP的相關(guān)參數(shù)傳遞與數(shù)據(jù)處理技巧,需要的朋友可以參考下2016-05-05jQuery實(shí)現(xiàn)帶進(jìn)度條的輪播圖
這篇文章主要為大家詳細(xì)介紹了jQuery實(shí)現(xiàn)帶進(jìn)度條的輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09