理解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 相关文章推荐
分享8款优秀的 jQuery 加载动画和进度条插件
Oct 24 Javascript
提高jQuery性能的十个诀窍
Nov 14 Javascript
JS获取各种浏览器窗口大小的方法
Jan 14 Javascript
使用text方法获取Html元素文本信息示例
Sep 01 Javascript
js中confirm实现执行操作前弹出确认框的方法
Nov 01 Javascript
JavaScript的this关键字的理解
Jun 18 Javascript
浅谈js中的三种继承方式及其优缺点
Aug 10 Javascript
jquery拖动改变div大小
Jul 04 jQuery
vue实现微信分享功能
Nov 28 Javascript
JS实现换肤功能的方法实例详解
Jan 30 Javascript
浅谈react-router@4.0 使用方法和源码分析
Jun 04 Javascript
js实现无缝轮播图插件封装
Jul 31 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 常用字符串函数总结
2008/03/15 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
PHP贪婪算法解决0-1背包问题实例分析
2015/03/23 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
Yii 2.0在Grid中格式化时间方法示例
2017/06/06 PHP
用 JSON 处理缓存
2007/04/27 Javascript
js中document.getElementByid、document.all和document.layers区分介绍
2011/12/08 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
AngularJS实现的回到顶部指令功能实例
2017/05/17 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
Python标准库与第三方库详解
2014/07/22 Python
用实例分析Python中method的参数传递过程
2015/04/02 Python
使用python实现生成用户信息
2017/03/20 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
详解python3中tkinter知识点
2018/06/21 Python
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
如何查看浏览器对html5的支持情况
2020/12/15 HTML / CSS
幼儿教师师德承诺书
2014/05/23 职场文书
运输企业安全生产责任书
2014/07/28 职场文书
初二英语教学反思
2016/02/15 职场文书
Pytest中conftest.py的用法
2021/06/27 Python
详解Spring事件发布与监听机制
2021/06/30 Java/Android