zoukankan      html  css  js  c++  java
  • 无阻赛的脚本(js脚本延迟方法)

     

    js脚本的加载与执行


    1、延迟脚本(defer属性) 
    带有defer属性的script标签,可以放置在文档的任何位置,在页面解析到该标签时,会开始下载该脚本,但是不会立即执行,直到dom加载完成(onload事件触发前执行)。并且defer属性的script叫脚本的下载,不会阻塞其他进程,这类文件可以和页面中的其他资源并行下载。 
    注:defer属性只有IE和FF3.5+支持

    2、 动态添加脚本 
    通过动态创建script标签引入外部脚本,加载完后立即执行。 
    这种技术的特点:无论何时启动下载,文件的下载和执行不会阻塞页面其他进程。(把新建的脚本放在head里面比body要好,以防body还未加载完成) 
    但是当有其他脚本依赖于该动态引进的脚本时,必须保证该脚本下载完毕并且准备就绪。FF、chrome等通过script的onload事件监听,而IE通过触发readystatechange事件来监听。 
    FF、Chrome

    script.onload=function (){
    //脚本加载完毕,可以执行依赖该脚本的操作
    };

    IE浏览器中:

    script.onreadystatechange=function (){
    if(script.readyState=='loaded' || script.readyState=='complete'){
    //脚本加载完毕
    }
    };

    综上,一个通用的方法:

    function loadscript(url,callback){
    var script=document.createElement('script');
    script.src=url;
    if(script.onload){
    script.onload=function (){
    //脚本加载完毕,可以执行依赖该脚本的操作
    callback();
    };
    }else{ //IE
    script.onreadystatechange=function (){
    if(script.readyState=='loaded' || script.readyState=='complete'){
    callback(); //脚本加载完毕
    }
    };
    }
    document.getElementsByTagName('head')[0].appendChild(script);
    }

    多个脚本有依赖关系时,可以 

    loadscript('f1.js',function (){ 
    loadscript('f2.js',function(){ }); 
    }); 

    3、XMLHttpRequest脚本注入

     
    var xhr = new XMLHttpRequest();
    xhr.open("get", "file1.js", true);
    xhr.onreadystatechange = function(){
    if (xhr.readyState == 4){
    if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
    var script = document.createElement ("script");
    script.type = "text/javascript";
    script.text = xhr.responseText;
    document.body.appendChild(script);
    }
    }
    };
    xhr.send(null);

    优点:所有主流浏览器都支持 
    缺点:请求的js脚本必须和页面处于相同的域(文件无法从CDN下载)。大型的web应用一般不会采用该方法。

    4、document.write Script Tag 


    使用document.write把HTML标签script写入页面。 
    缺点是只有在IE中是并行加载脚本的。 
    代码如下:

    document.write("<script type='text/javascript' src='test.js'></script>");
  • 相关阅读:
    cogs 826. [Tyvj Feb11] GF打dota 次短路详细原创讲解! dijkstra
    cogs 2450. 距离 树链剖分求LCA最近公共祖先 快速求树上两点距离 详细讲解 带注释!
    cogs 647. [Youdao2010] 有道搜索框 Trie树 字典树
    cogs 293. [NOI 2000] 单词查找树 Trie树字典树
    P4550 收集邮票
    P1850 换教室 期望dp
    洛谷 UVA11021 Tribles
    P3802 小魔女帕琪 概率与期望
    P3369 【模板】普通平衡树 01Trie树
    P2765 魔术球问题
  • 原文地址:https://www.cnblogs.com/lydialee/p/4009731.html
Copyright © 2011-2022 走看看