Firefox 3.6 |
|
IE 8 |
|
Chrome 10 |
|
Safari 4 |
|
Opera 11 |
|
可以看出各個主流瀏覽器的行為一致。雖然jQueryUI在服務器延遲了2秒鐘再返回,但是后引入的內聯JavaScript還是等待了2秒,等前面引入的JavaScript執行完畢才執行。這也是著名的JavaScript順序執行的特性。 Firefox 3.6 IE 8 Chrome 10 Safari 4 Opera 11
3. 通過JavaScript添加script標簽(test3.htm)
我們首先定義一個addScript函數,用來引入外部或者內聯JavaScript。test3.htm的頁面源代碼如下:
<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>
我們分別在各種瀏覽器中測試這個例子:
test3.htm
通過JavaScript添加<script>標簽 




可見,通過JavaScript在DOM加載完畢后再引入外部或者內聯JavaScript時,Firefox和Opera的行為一致,能夠確保JavaScript的執行順序和引入順序一致。但是IE8, Chrome, Safari 卻不能保證這個執行順序。
雖然各種瀏覽器在確保執行順序方面不盡相同,不過這時的最大好處是多個JavaScript文件能夠并行下載,這在所有瀏覽器中行為一致。當然這不是這篇文章的主題,可以Google更多細節。
如何解決各個瀏覽器的不一致性,下面提供了兩個解決方案: Firefox 3.6 IE 8 Chrome 10 Safari 4 Opera 11 Firefox 3.6 IE 8 Chrome 10 Safari 4 Opera 11
4. 方案一,如何在動態添加script標簽時確保執行順序
有時頁面邏輯要求我們必須通過上面的方式動態執行JavaScript,那么如何確保所有瀏覽器下的執行順序(目前只有Firefox和Opera確保執行順序)。
其實解決方案很簡單,我們為函數執行添加一個complete的回調函數就行了。下面的test4.htm給出了具體的解決方案:
<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>
此時所有瀏覽器中的行為一致:
test4.htm
通過回調函數解決動態添加JavaScript的順序問題 




5. 方案二,使用jQuery的html函數動態添加JavaScript
jQuery的html函數用來更新一個DOM片段,我們可以很方便的通過這個函數來動態加載JavaScript,請看示例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>
此時,各個瀏覽器中的行為一致:
test2.htm
通過jQuery的html函數解決動態添加JavaScript的順序問題 




6. 后記
為什么jQuery的html函數能夠確保動態加載JavaScript的執行順序呢?
我們知道通過簡單的 .innerHTML 更新DOM節點,是不會讓其中的JavaScript的執行,我們可以簡單的把這個例子的源代碼改成:
$('#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根本不會加載。
那么jQuery是如果做到的呢?下篇文章我們會追根溯源,詳細分析jQuery源代碼,請繼續瀏覽: 如何確保JavaScript的執行順序
主站蜘蛛池模板:
深州市|
西华县|
青铜峡市|
德庆县|
共和县|
咸丰县|
富蕴县|
阳泉市|
浙江省|
交口县|
临颍县|
固镇县|
吴川市|
五寨县|
华亭县|
长宁县|
太康县|
襄樊市|
临漳县|
县级市|
洛阳市|
凤庆县|
大石桥市|
金沙县|
昌都县|
思茅市|
八宿县|
屯昌县|
灵台县|
晴隆县|
漯河市|
紫金县|
个旧市|
溧水县|
青州市|
蛟河市|
天津市|
北宁市|
扎兰屯市|
浙江省|
朝阳县|