理解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 相关文章推荐
Ext javascript建立超链接,进行事件处理的实现方法
Mar 22 Javascript
js判断设备是否为PC并调整图片大小
Feb 12 Javascript
Node.js实现简单聊天服务器
Jun 20 Javascript
Javascript学习笔记之数组的构造函数
Nov 23 Javascript
js实现编辑div节点名称的方法
Dec 17 Javascript
JavaScript中的console.trace()函数介绍
Dec 29 Javascript
transport.js和jquery冲突问题的解决方法
Feb 10 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
Aug 02 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
Mar 21 Javascript
关于express与koa的使用对比详解
Jan 25 Javascript
JavaScript常见继承模式实例小结
Jan 11 Javascript
JavaScript canvas绘制渐变颜色的矩形
Feb 18 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
php 获取当前访问的url文件名的方法小结
2010/02/08 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
2015/03/02 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
2016/08/17 PHP
php实现文章评论系统
2019/02/18 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
js 操作css实现代码
2009/06/11 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
Javasipt:操作radio标签详解
2013/12/30 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
Vue CLI3中使用compass normalize的方法
2019/05/30 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
Python 元类使用说明
2009/12/18 Python
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
python3.4实现邮件发送功能
2018/05/28 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
2021/01/05 Python
德国亚洲食品网上商店:asiafoodland.de
2019/12/28 全球购物
蟋蟀的住宅教学反思
2014/04/26 职场文书
大学生个人求职信
2014/06/02 职场文书
PHP使用QR Code生成二维码实例
2021/07/07 PHP