美文网首页程序员技术文
同步按顺序动态加载JS

同步按顺序动态加载JS

作者: 一千年以后 | 来源:发表于2015-08-04 14:03 被阅读1376次

我们知道, 现代主流浏览器(如chrome)加载js是异步执行的,会同时加载多个js,那么当我们需要在js中动态加载其他的js时候,他们的完成顺序并不是像我们主观想象的那样,先写的先加载。例如:

function loadScript(url, fn) {    var script = document.createElement("script");    script.type = "text/javascript";    script.src = url;    script.onload = script.onreadystatechange = function () {        if (!script.readyState || 'loaded' === script.readyState || 'complete' === script.readyState) {            fn && fn();        }    };    script.src = url;    document.head.appendChild(script);} 这是一段动态加载js的代码,倘若写成:loadScript("http://cdn.bootcss.com/Chart.js/2.0.0-alpha3/Chart.js",function(){document.getElementById("test").innerHTML+="chart;"}); loadScript("http://cdn.bootcss.com/jquery/1.11.2/jquery.js",function(){document.getElementById("test").innerHTML+="jquery;"; }); loadScript("http://cdn.gbtags.com/jquery-color/2.1.2/jquery.color.min.js",function(){document.getElementById("test").innerHTML+="jq-color;"});loadScript("http://cdn.gbtags.com/jquery-easing/1.3/jquery.easing.min.js",function(){document.getElementById("test").innerHTML+="jq-easing;"});  

那么结果正常情况下是:chart;jquery;jq-color;jq-easing; 你以为所有情况都是这种理想情况吗?too young ! too simple ! 假如加载速度都非常快的时候,或者js都存在缓存时候也许会这样!大多数情况下是这样的:

jquery;jq-color;jq-easing;chart;

或者jq-color;jq-easing;jquery;chart;等等可见顺序不是固定的,假如写在后面的easing.js又用到了前面jquery.js的内容,哇!肯定就会出现一系列的undefined错误,想想就可怕!那么!我们就必须在动态加载js的时候将异步变为同步!如下所示:newScripts是一个将要加载的script的顺序集合,采用迭代方法将他们依次加载,确保加载执行顺序:

 var newScripts = ["http://cdn.bootcss.com/Chart.js/2.0.0-alpha3/Chart.js","http://cdn.bootcss.com/jquery/1.11.2/jquery.js","http://cdn.gbtags.com/jquery-color/2.1.2/jquery.color.min.js","http://cdn.gbtags.com/jquery-easing/1.3/jquery.easing.min.js"];//迭代加载,callback为全部加载完成后的回调函数(function scriptRecurse(count, callback) {  if (count == newScripts.length) {    callback && callback();  } else {    loadScript(newScripts[count], function () {      document.getElementById("test2").innerHTML+=newScripts[count]+";

";      scriptRecurse(++count, callback);    });  }})(0);

相关文章

  • 同步按顺序动态加载JS

    我们知道, 现代主流浏览器(如chrome)加载js是异步执行的,会同时加载多个js,那么当我们需要在js中动态加...

  • html,css,js加载顺序

    1. 加载方式 css 异步加载(不阻塞)js 同步加载(阻塞) 2. 放置顺序 css 放置于 标签中原因:...

  • Review JavaScript

    红宝书 综合 script加载js会阻塞渲染,标签中 fefer 指异步加载js,在文档load之后按顺序执行。a...

  • 【JavaScript】js动态添加dom,如何绑定事件

    首先要明白浏览器在加载页面的时候是按顺序来加载的,这样以来就很清楚了,js动态添加dom以后,这些dom并没有绑定...

  • html、css、js在页面中加载的顺序

    ***先告诉大家页面是自上而下按顺序加载的 link->js->body 页面内容...

  • JavaScript动态加载js和css

    动态加载js 参考:javascript 性能优化 动态加载css 参考: 动态加载 css 方法实现和深入解析 ...

  • js 标签的属性

    浏览器执行顺序 按顺序解析执行,当遇到 、 时,浏览器开分支执行。 js执行引擎和渲染引擎不会同步执行。

  • 用$.getScript()动态同步加载js——串行加载

    页面的js要根据用途不同,选择动态加载压缩后代码,还是源码。而不管是哪种,在各个js有相互依赖关系的时候,我们都希...

  • 系统源码简析

    同步加载 异步加载 页面的懒加载,只针对vue文件,js文件被放到app.js中了, 比如 share.js。 a...

  • js动态加载HTML元素时点击事件无效

    js动态加载HTML元素时点击事件无效: 是因为这些动态加载的这些HTML,是在css,js代码加载完后,再添加的...

网友评论

    本文标题:同步按顺序动态加载JS

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