理解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中的String对象详谈
Mar 03 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
Mar 05 Javascript
三种取消选中单选框radio的方法
Sep 09 Javascript
JavaScript中判断整字类型最简洁的实现方法
Nov 08 Javascript
jQuery原生的动画效果
Jul 10 Javascript
再谈JavaScript线程
Jul 10 Javascript
ReactJs快速入门教程(精华版)
Nov 28 Javascript
Vue的MVVM实现方法
Aug 16 Javascript
Angularjs中数据绑定的实例详解
Aug 25 Javascript
vue实现输入框自动跳转功能
May 20 Javascript
vue离开当前页面触发的函数代码
Sep 01 Javascript
JS实现点击掉落特效
Jan 29 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输出不同的心形图案
2016/04/22 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
js数组去重的常用方法总结
2014/01/24 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
Javascript玩转继承(一)
2014/05/08 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
js简单粗暴的发布订阅示例代码
2021/01/23 Javascript
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
2014/06/25 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
python实现合并多个list及合并多个django QuerySet的方法示例
2019/06/11 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
2020/05/25 Python
python文件读取失败怎么处理
2020/06/23 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
化学学院毕业生自荐信范文
2013/12/17 职场文书
2014端午节活动策划方案
2014/01/27 职场文书
优秀团支部事迹材料
2014/02/08 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
验房委托书
2014/08/30 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
语文教师求职信范文
2015/03/20 职场文书
音乐课外活动总结
2015/05/09 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
python使用pymysql模块操作MySQL
2021/06/16 Python
MySQL实现字段分割一行转多行的示例代码
2022/07/07 MySQL