麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

IE8中動態創建script標簽onload無效的解決方法

2019-11-20 13:38:46
字體:
來源:轉載
供稿:網友

本文實例講述了IE8中動態創建script標簽onload無效的解決方法。分享給大家供大家參考。具體分析如下:

今天做項目,發現一個奇怪的問題,動態創建的script標簽在IE8下無法觸發onload事件。

代碼如下:

復制代碼 代碼如下:
var loadJs = function(src, fun){
    var script = null;
    script = document.createElement("script");
    script.type = "text/javascript";
    script.src = src;
    if(typeof fun === "function"){
        script.onload = fun;
    }
 
    document.getElementsByTagName("head")[0].appendChild(script);
};
 
loadJs("js/jquery-1.11.0.min.js", function(){
    console.log("From jQuery");         
});
 
loadJs("test.js", function(){
    console.log("From test.js");         
});
test.js:
console.log(typeof jQuery);

運行結果:
復制代碼 代碼如下:
undefined  // test.js運行時,jQuery還未加載
>> typeof jQuery  // 從控制臺上運行,卻找到了jQuery對象,證明加載順序問題
"function"

并且以上代碼中script.onload并沒有執行,明明代碼已經加載進來了,為什么還是onload不執行呢?到網上一查發現眾多前端開發人員都遇到這個棘手的問題,于是找到了一些替補方案,如下:
復制代碼 代碼如下:
var loadJs = function(src, fun){
    var script = null;
    script = document.createElement("script");
    script.type = "text/javascript";
    script.src = src;
    if(typeof fun === "function"){
        script.onreadystatechange = function() {
            var r = script.readyState;
            console.log(src + ": " + r);
            if (r === 'loaded' || r === 'complete') {
                script.onreadystatechange = null;
                fun();
            }
        };
    }
 
    document.getElementsByTagName("head")[0].appendChild(script);
};

執行結果:
復制代碼 代碼如下:
undefined 
js/jquery-1.11.0.min.js: loading 
test.js: complete 
From test.js 
js/jquery-1.11.0.min.js: loaded 
From jQuery

執行步驟為,這下類似于onload的功能算然算是找到了,但卻有一個問題,它不是按順序加載的,當jQuery文件loading的時候,test.js已經complete了,并且第一行就先執行了test.js的內容。因為test.js先于jQuery執行,所以才打出undefined。于是我們可以改寫成這樣,讓它線性加載:
復制代碼 代碼如下:
loadJs("js/jquery-1.11.0.min.js", function(){
 
    console.log("From jQuery"); 
 
    loadJs("test.js", function(){
        console.log("From test.js");         
    });       
});

執行結果:
復制代碼 代碼如下:
js/jquery-1.11.0.min.js: loading 
js/jquery-1.11.0.min.js: loaded 
From jQuery 
function
test.js: complete 
From test.js

這次,執行的順序完全是按照我們預訂的順序來了,但以上代碼看著很別扭,需要層層嵌套,于是又發現了這種寫法:
復制代碼 代碼如下:
var loadJs = function(src, fun){
    var script = null;
    script = document.createElement("script");
    script.type = "text/javascript";
    script.src = src;
    if(typeof fun === "function"){
        script.onreadystatechange = function() {
            var r = script.readyState;
            console.log(src + ": " + r);
            if (r === 'loaded' || r === 'complete') {
                script.onreadystatechange = null;
                fun();
            }
        };
    }
 
    document.write(script.outerHTML);
    //document.getElementsByTagName("head")[0].appendChild(script);
 
};
 
loadJs("js/jquery-1.11.0.min.js", function(){
    console.log("From jQuery"); 
});
 
loadJs("test.js", function(){
    console.log("From test.js");         
});

執行結果的順序,也不相同:
復制代碼 代碼如下:
function
js/jquery-1.11.0.min.js: loaded 
From jQuery 
test.js: loaded 
From test.js

如果你改變一下加載順序
復制代碼 代碼如下:
loadJs("test.js", function(){
    console.log("From test.js");         
});
 
loadJs("js/jquery-1.11.0.min.js", function(){
    console.log("From jQuery"); 
});

執行結果也就不一樣,類似順序加載:
復制代碼 代碼如下:
undefined 
test.js: loaded 
From test.js 
js/jquery-1.11.0.min.js: loaded 
From jQuery

希望本文所述對大家的javascript程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国内精品视频饥渴少妇在线播放 | 娇妻被各种姿势c到高潮小说 | 久久色播| 天堂成人国产精品一区 | 欧美毛片在线观看 | 亚洲射吧 | 美国av在线免费观看 | 久久国产一二区 | 黄色小视频在线免费看 | 亚洲国产精品久久久久婷婷老年 | 欧美日韩经典在线 | 久久影院免费观看 | 中国洗澡偷拍在线播放 | 欧美日韩一 | 亚洲第一成网站 | 免费观看9x视频网站在线观看 | 欧美性生活久久久 | 国产韩国精品一区二区三区久久 | 欧美黄色一级带 | 亚洲精品久久久久www | 久久精品99久久久久久2456 | 日韩美香港a一级毛片免费 日韩激情 | 性猛交ⅹxxx乱巴西 欧美日韩1区2区3区 | 在线视频观看一区二区 | 亚洲精品欧美二区三区中文字幕 | 日本黄色免费观看视频 | 久久蜜桃香蕉精品一区二区三区 | 日韩激情在线视频 | 国产一区二区三区在线视频 | 曰韩在线视频 | 国产亚洲精品成人a | 3344永久免费| 久久久久久久国产视频 | 国产一区二区在线免费观看 | 欧美成人精品一区二区三区 | 国产羞羞网站 | 久久精品99久久久久久2456 | 久久草在线视频国产 | 一级免费大片 | 久久国产精品久久久久久 | 欧美一级爱爱 |