理解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 程序库的比较(一)之DOM功能
Apr 07 Javascript
js下将字符串当函数执行的方法
Jul 13 Javascript
基于jQuery的弹出框插件
Mar 18 Javascript
jQuery中fadeOut()方法用法实例
Dec 24 Javascript
再谈javascript注入 黑客必备!
Sep 14 Javascript
node.js基于mongodb的搜索分页示例
Jan 22 Javascript
基于JavaScript实现的插入排序算法分析
Apr 14 Javascript
Bootstrap响应式表格详解
May 23 Javascript
Vue自定义事件(详解)
Aug 19 Javascript
vue项目常用组件和框架结构介绍
Dec 24 Javascript
jQuery实现动态显示select下拉列表数据的方法
Feb 05 jQuery
Js数组扁平化实现方法代码总汇
Nov 11 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实现简单文件下载的方法
2015/01/30 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
jQuery实现HTML5 placeholder效果实例
2014/12/09 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
node.js实现登录注册页面
2017/04/08 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
jQuery条件分页 代替离线查询(附代码)
2017/08/17 jQuery
Vue在页面右上角实现可悬浮/隐藏的系统菜单
2018/05/04 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
Python中index()和seek()的用法(详解)
2017/04/27 Python
numpy中矩阵合并的实例
2018/06/15 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
解决Django Static内容不能加载显示的问题
2019/07/28 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
详解Python流程控制语句
2020/10/28 Python
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
关于VPN
2012/06/10 面试题
安全标准化汇报材料
2014/02/03 职场文书
2014最新开业庆典策划方案(5篇)
2014/09/15 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
学生会主席任命书
2015/09/21 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书
win10系统xps文件怎么打开?win10打开xps文件的两种操作方法
2022/07/23 数码科技