理解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 相关文章推荐
原生javascript实现图片弹窗交互效果
Jan 12 Javascript
jQuery幻灯片带缩略图轮播效果代码分享
Aug 17 Javascript
浅谈JavaScript的计时器对象
Dec 26 Javascript
vue插件vue-resource的使用笔记(小结)
Aug 04 Javascript
JS中Attr的用法详解
Oct 09 Javascript
angular1配合gulp和bower的使用教程
Jan 19 Javascript
详解webpack 入门与解析
Apr 09 Javascript
Vue 中可以定义组件模版的几种方式
Aug 06 Javascript
解决layui动态加载复选框无法选中的问题
Sep 20 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
Oct 16 Javascript
微信小程序动态设置图片大小的方法
Nov 21 Javascript
jquery实现弹窗(系统提示框)效果
Dec 10 jQuery
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
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
php array_unique之后json_encode需要注意
2011/01/02 PHP
检测codeigniter脚本消耗内存情况的方法
2015/03/21 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
jquery 可排列的表实现代码
2009/11/13 Javascript
从零开始学习jQuery (六) jquery中的AJAX使用
2011/02/23 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
JavaScript常用的弹出广告及背投广告实现方法
2015/02/06 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
JavaScript程序开发之JS代码放置的位置
2016/01/15 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
微信小程序开发之IOS和Android兼容的问题
2017/09/26 Javascript
React Router V4使用指南(精讲)
2018/09/17 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
google广告之另类js调用实现代码
2020/08/22 Javascript
[06:57]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD 选手采访
2021/03/11 DOTA
写了个监控nginx进程的Python脚本
2012/05/10 Python
python中OrderedDict的使用方法详解
2017/05/05 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
python opencv捕获摄像头并显示内容的实现
2019/07/11 Python
python用match()函数爬数据方法详解
2019/07/23 Python
django使用admin站点上传图片的实例
2019/07/28 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
Python web如何在IIS发布应用过程解析
2020/05/27 Python
移动端开发HTML5页面点击按钮后出现闪烁或黑色背景的解决办法
2018/09/19 HTML / CSS
澳大利亚购买最佳炊具品牌网站:Cookware Brands
2019/02/16 全球购物
创先争优一句话承诺
2014/05/29 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
2015年安康杯竞赛活动总结
2015/03/26 职场文书
海上钢琴师的观后感
2015/06/11 职场文书
教你怎么用python实现字符串转日期
2021/05/24 Python
JavaWeb实现显示mysql数据库数据
2022/03/19 Java/Android