Web动态加载JS外部文件(script标签)

作者: jicemoon | 来源:发表于2016-03-30 11:38 被阅读3722次

    ( 摘自高性能Javascript )
    文档对象模型(DOM)允许你使用JavaScript 动态创建HTML的几乎全部文档内容。其根本在于,<script>元素与页面其他元素没有什么不同:引用变量可以通过DOM进行检索,可以从文档中移动、删除,也可以被创建.

    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = "file1.js";
    document.getElementsByTagName_r("head")[0].appendChild(script);
    

    新的<script>元素加载file1.js源文件。此文件当元素添加到页面之后立刻开始下载。此技术的重点在于:无论在何处启动下载,文件的下载和运行都不会阻塞其他页面处理过程。你甚至可以将这些代码放在<head>部分而不会对其余部分的页面代码造成影响(除了用于下载文件的HTTP 连接)。

    当文件使用动态脚本节点下载时,返回的代码通常立即执行(除了Firefox和Opera,他们将等待此前的所有动态脚本节点执行完毕)。当脚本是“自运行”类型时这一机制运行正常,但是如果脚本只包含供页面其他脚本调用调用的接口,则会带来问题。这种情况下,你需要跟踪脚本下载完成并准备妥善的情况。可以使用动态<script>节点发出事件得到相关信息。

    Firefox, Opera, Chorme, IE11+ 和Safari3+会在<script>节点接收完成之后发出一个load 事件。你可以监听这一事件,以得到脚本准备好的通知:

    var script = document.createElement("script")
    script.type = "text/javascript";
    //Firefox, Opera, Chrome, Safari 3+
    script.onload = function(){
        alert("Script loaded!");
    };
    script.src = "file1.js";
    document.getElementsByTagName_r("head")[0].appendChild(script);
    

    Internet Explorer(IE10及以下版本)支持另一种实现方式,它发出一个readystatechange事件。<script>元素有一个readyState属性,它的值随着下载外部文件的过程而改变。readyState 有五种取值:

    • uninitialized: 默认状态
    • loading: 下载开始
    • loaded: 下载完成
    • interactive: 下载完成但尚不可用
    • complete: 所有数据已经准备好

    微软文档上说,在<script>元素的生命周期中,readyState 的这些取值不一定全部出现,但并没有指出哪些取值总会被用到。实践中,我们最感兴趣的是“loaded”和“complete”状态。Internet Explorer 对这两个readyState值所表示的最终状态并不一致,有时<script>元素会得到“loader”却从不出现“complete”,但另外一些情况下出现“complete”而用不到“loaded”。最安全的办法就是在readystatechange 事件中检查这两种状态,并且当其中一种状态出现时,删除readystatechange事件句柄(保证事件不会被处理两次):

    var script = document.createElement("script")
    script.type = "text/javascript";
    //Internet Explorer
    script.onreadystatechange = function(){
        if (script.readyState == "loaded" || script.readyState == "complete"){
            script.onreadystatechange = null;
            alert("Script loaded.");
        }
    };
    script.src = "file1.js";
    document.getElementsByTagName_r("head")[0].appendChild(script);
    

    大多数情况下,你希望调用一个函数就可以实现JavaScript 文件的动态加载。下面的函数封装了标准实现和IE 实现所需的功能:

    function loadScript(url, callback){
        var script = document.createElement ("script")
        script.type = "text/javascript";
        if (script.readyState){ //IE
            script.onreadystatechange = function(){
                if (script.readyState == "loaded" || script.readyState == "complete"){
                    script.onreadystatechange = null;
                    callback();
                }
            };
        } else { //Others
            script.onload = function(){
                callback();
            };
        }
        script.src = url;
        document.getElementsByTagName_r("head")[0].appendChild(script);
    }
    

    相关文章

      网友评论

      • littledust:有什么具体的应用。。暂时还没有遇到过这种需求
        立刻行动_50f3:JQUERY的JSONP回调函数,就是这个原理。作者很好学,值得称赞。书是好书。
        jicemoon:@littledust 有的时候javascript文件太大, 或者运行所需时间过长, 可以用这种方法加载, 并且不影响网页的加载速度
      • o依风听雨o:前端不是很熟 学习下~
        jicemoon:@o依风听雨o 这是前几天看书 摘抄的 一起学习.....

      本文标题:Web动态加载JS外部文件(script标签)

      本文链接:https://www.haomeiwen.com/subject/rvoslttx.html