理解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_05_原型继承原理
Oct 13 Javascript
40个新鲜出炉的jQuery 插件和免费教程[上]
Jul 24 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
Jan 24 Javascript
jQuery避免$符和其他JS库冲突的方法对比
Feb 20 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
Feb 18 Javascript
举例讲解jQuery中可见性过滤选择器的使用
Apr 18 Javascript
AngularJS服务service用法总结
Dec 13 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
Nov 06 Javascript
在vue中使用vuex,修改state的值示例
Nov 08 Javascript
nodemon实现Typescript项目热更新的示例代码
Nov 19 Javascript
原生JS实现九宫格抽奖
Sep 13 Javascript
浅谈react路由传参的几种方式
Mar 23 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
提问的智慧
2006/10/09 PHP
一个显示天气预报的程序
2006/10/09 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
怎样搭建PHP开发环境
2015/07/28 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
php封装的单文件(图片)上传类完整实例
2016/10/18 PHP
PHP 类与构造函数解析
2017/02/06 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
jQuery load方法用法集锦
2011/12/06 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
2015/06/19 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
SpringMVC简单整合Angular2的示例
2017/07/31 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
jQuery实现手风琴效果(蒙版)
2020/01/11 jQuery
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
2015/04/25 Python
python内打印变量之%和f的实例
2020/02/19 Python
Jupyter notebook如何修改平台字体
2020/05/13 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
巧用CSS3的calc()宽度计算做响应模式布局的方法
2018/03/22 HTML / CSS
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
银行求职信个人范文
2013/12/16 职场文书
运动员口号
2014/06/09 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
新党章心得体会
2014/09/04 职场文书
专家推荐信范文
2015/03/26 职场文书
2015年个人审计工作总结
2015/04/07 职场文书
公司辞职信模板
2015/05/13 职场文书