理解Javascript文件动态加载


Posted in Javascript onJanuary 29, 2016

Javascript文件动态加载一直是比较困扰的一件事情,像网络上传的比较常见的做法:

function loadjs(fileurl){
 var sct = document.createElement("script");
 sct.src = fileurl;
 document.head.appendChild(sct);
}

然后我们来测试一下结果:

<html>
  <head>
   <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" media="screen" />
  </head>
  <body>
    <script>
    function loadjs(fileurl){      
     var sct = document.createElement("script");
     sct.src = fileurl;
     document.head.appendChild(sct);
    }
    loadjs("http://code.jquery.com/jquery-1.12.0.js");
    loadjs("http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js")
    
    loadjs("http://bootboxjs.com/bootbox.js")
    </script>
  </body>
</html>

代码加载完后,会出现下图的错误:

理解Javascript文件动态加载

jquery明明是加载在第一个处理,为什么还是报jQuery不存在的对象呢?

因为这样加载,相当于开启了三个线程,只是jquery这个文件先启动线程,而jquery执行完这个线程的时间,超过了后面两个时间. 因此后面执行完的,可能没能找到jquery这个对象。

然这种方式怎么处理呢?

其实文件的加载是有个状态处理的.文件的加载有个onload事件,就是可以监听文件是否加载完成的事件.

因此我们可以考虑这个方法来处理我们想要的结果.我们用直观的方式来处理.改进后的代码如下:

<html>
  <head>
   <link rel="stylesheet" type="text/css" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" media="screen" />
  </head>
  <body>
    <script>
    
    function loadjs(fileurl, fn){      
     var sct = document.createElement("script");
     sct.src = fileurl;
     if(fn){
      sct.onload = fn;
     }
     document.head.appendChild(sct);
    }


    loadjs("http://code.jquery.com/jquery-1.12.0.js",function(){
     loadjs("http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js",function(){
        loadjs("http://bootboxjs.com/bootbox.js")
     })
    });
      
    
    </script>
  </body>
</html>

OK,执行完这个代码之后,加载文件都是在前一个加载完成后,才会加载另外一个,这样就不会造成找不到用到的对象了.

然后我们来执行一个弹出框的效果,代码里面使用了 Bootbox.js 插件. 加载代码如下:

loadjs("http://code.jquery.com/jquery-1.12.0.js",function(){
  loadjs("http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js",function(){
       loadjs("http://bootboxjs.com/bootbox.js",function(){
          bootbox.alert("Hello world!", function() {
           Example.show("Hello world callback");
          });
       })
   })
 });

刷新页面,就会直接显示弹出框:

理解Javascript文件动态加载

动态加载的代码,往往容易在这里花费很多时间调试.大家最好的办法就是写一个最简单的例子,理解其中的原因. 这里的代码都可以进行封装,还可以加入CSS文件的加载.作为自己的插件使用。

Javascript 相关文章推荐
杨氏矩阵查找的JS代码
Mar 21 Javascript
基于JavaScript 类的使用详解
May 07 Javascript
js验证IP及子网掩码的合法性有效性示例
Apr 30 Javascript
jQuery插件kinMaxShow扩展效果用法实例
May 04 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
Sep 05 Javascript
VueJS事件处理器v-on的使用方法
Sep 27 Javascript
详解Node.js读写中文内容文件操作
Oct 10 Javascript
JavaScript中引用vs复制示例详析
Dec 06 Javascript
详解VSCode配置启动Vue项目
May 14 Javascript
全面分析JavaScript 继承
May 30 Javascript
layui实现显示数据表格、搜索和修改功能示例
Jun 03 Javascript
在VUE style中使用data中的变量的方法
Jun 19 Javascript
JavaScript操作select元素和option的实例代码
Jan 29 #Javascript
JavaScript学习总结之JS、AJAX应用
Jan 29 #Javascript
Angularjs中UI Router全攻略
Jan 29 #Javascript
JavaScript数据结构与算法之集合(Set)
Jan 29 #Javascript
AngularJS 使用 UI Router 实现表单向导
Jan 29 #Javascript
JavaScript数据结构与算法之链表
Jan 29 #Javascript
动态创建按钮的JavaScript代码
Jan 29 #Javascript
You might like
解析php中static,const与define的使用区别
2013/06/18 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
thinkphp中字符截取函数msubstr()用法分析
2016/01/09 PHP
深入浅析用PHP实现MVC
2016/03/02 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
js玩一玩WSH吧
2007/02/23 Javascript
(推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
2007/04/29 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
如何使用VuePress搭建一个类型element ui文档
2019/02/14 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
2020/09/24 Javascript
解决removeEventListener 无法清除监听的问题
2020/10/30 Javascript
python timestamp和datetime之间转换详解
2017/12/11 Python
python矩阵的转置和逆转实例
2018/12/12 Python
详解Python做一个名片管理系统
2019/03/14 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
2020/05/19 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
美国领先的医疗警报服务:Philips Lifeline
2018/03/12 全球购物
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
艺术节主持词
2014/04/02 职场文书
责任心演讲稿
2014/05/14 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
小学国庆节活动总结
2015/03/23 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
律政俏佳人观后感
2015/06/09 职场文书