动态加载JavaScript文件的两种方法


Posted in Javascript onApril 22, 2016

这篇文章主要为大家详细介绍了动态加载JavaScript文件的两种方法,感兴趣的小伙伴们可以参考一下
第一种便是利用ajax方式,把script文件代码从背景加载到前台,而后对加载到的内容经过eval()实施代码。第二种是,动静创建一个script标签,配置其src属性,经过把script标签插入到页面head来加载js,相当于正在head中写了一个<script src="..."></script>,只可是这个script标签是用js动静创建的
比喻说是我们要动静地加载一个callbakc.js,我们就必要多么一个script标签:
代码如下:  

<script type="text/javascript" src="call.js"></script>

如下代码就是如何通过js来创建这个标签(并且加到head中): 
代码如下:

var head= document.getElementsByTagName('head')[0]; 
var script= document.createElement('script'); 
script.type= 'text/javascript'; 
script.src= 'call.js'; 
head.appendChild(script);

当加载完call.js, 我们就要调用其中的方法。不过在header.appendChild(script)之后我们不能马上调用其中的js。因为浏览器是异步加载这个js的,我们不知道他什么时候加载完。然而我们可以通过监听事件的办法来判断helper.js是否加载完成。(假设call.js中有一个callback方法) 代码如下:

var head= document.getElementsByTagName('head')[0]; 
var script= document.createElement('script'); 
script.type= 'text/javascript'; 
script.onreadystatechange= function () { 
if (this.readyState == 'complete') 
callback(); 
} 
script.onload= function(){ 
callback(); 
} 
script.src= 'helper.js'; 
head.appendChild(script);

我设了2个事件监听函数, 因为在ie中使用onreadystatechange, 而gecko,webkit 浏览器和opera都支持onload。事实上this.readyState == 'complete'并不能工作的很好,理论上状态的变化是如下步骤:
1.uninitialized
2.loading
3.loaded
4.interactive
5.complete
但是有些状态会被跳过。根据经验在ie7中,只能获得loaded和completed中的一个,不能都出现,原因也许是对判断是不是从cache中读取影响了状态的变化,也可能是其他原因。最好把判断条件改成this.readyState == 'loaded' || this.readyState == 'complete'

参考jQuery的实现我们最后实现为: 代码如下: 

var head= document.getElementsByTagName('head')[0]; 
var script= document.createElement('script'); 
script.type= 'text/javascript'; 
script.onload = script.onreadystatechange = function() { 
if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete" ) { 
help(); 
// Handle memory leak in IE 
script.onload = script.onreadystatechange = null; 
} }; 
script.src= 'helper.js'; 
head.appendChild(script);

还有一种简单的情况就是可以把help()的调用写在helper.js的最后,那么可以保证在helper.js在加载完后能自动调用help(),当然最后还要能这样是不是适合你的应用。

另外需要注意:

1.因为script标签的src可以跨域访问资源,所以这种方法可以模拟ajax,解决ajax跨域访问的问题。
2.如果用ajax返回的html代码中包含script,则直接用innerHTML插入到dom中是不能使html中的script起作用的。粗略的看了下jQuery().html(html)的原代码,jQuery也是先解析传入的参数,剥离其中的script代码,动态创建script标签,所用jQuery的html方法添加进dom的html如果包含script是可以执行的。如:  
 

jQuery("#content").html("<script>alert('aa');<\/script>");

以上就是动态加载JavaScript文件的方法,希望对大家的学习有所帮助。

Javascript 相关文章推荐
用 JavaScript 迁移目录
Dec 18 Javascript
iframe 自适应高度[在IE6 IE7 FF下测试通过]
Apr 13 Javascript
JavaScript高级程序设计 读书笔记之十一 内置对象Global
Mar 07 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
Sep 14 Javascript
用js设置下拉框为只读的小技巧
Apr 10 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
Mar 13 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
Oct 31 Javascript
AngularJS学习笔记之表单验证功能实例详解
Jul 06 Javascript
详解angularjs跨页面传参遇到的一些问题
Nov 01 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
Mar 06 Javascript
小程序api实现promise封装过程解析
Nov 21 Javascript
微信小程序使用自定义组件导航实现当前页面高亮
Jan 02 Javascript
JavaScript记录光标在编辑器中位置的实现方法
Apr 22 #Javascript
在AngularJS中使用jQuery的zTree插件的方法
Apr 21 #Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
Apr 21 #Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
Apr 21 #Javascript
javascript常见数字进制转换实例分析
Apr 21 #Javascript
BootStrap和jQuery相结合实现可编辑表格
Apr 21 #Javascript
动态加载js文件简单示例
Apr 21 #Javascript
You might like
用PHP实现多级树型菜单
2006/10/09 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
php如何调用webservice应用介绍
2012/11/24 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
php curl的深入解析
2013/06/02 PHP
php获取参数的几种方法总结
2014/02/18 PHP
php实现获取文件mime类型的方法
2015/02/11 PHP
PHP session文件独占锁引起阻塞问题解决方法
2015/05/12 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
20个最新的jQuery插件
2012/01/13 Javascript
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
2012/02/27 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
JS与jQuery遍历Table所有单元格内容的方法
2015/12/07 Javascript
使用javascript插入样式
2016/03/14 Javascript
jQuery检查元素存在性(推荐)
2016/09/17 Javascript
基于JavaScript实现轮播图原理及示例
2020/04/10 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
vue 递归组件的简单使用示例
2021/01/14 Vue.js
Python实现的概率分布运算操作示例
2017/08/14 Python
pandas多级分组实现排序的方法
2018/04/20 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
用Python解数独的方法示例
2019/10/24 Python
使用python实现希尔、计数、基数基础排序的代码
2019/12/25 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
中级会计职业生涯规划范文
2014/01/16 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
大学生标准自荐书
2014/06/15 职场文书
2014年教学工作总结
2014/11/13 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
调解协议书范本
2016/03/21 职场文书
Python序列化模块JSON与Pickle
2022/06/05 Python
JS前端可视化canvas动画原理及其推导实现
2022/08/05 Javascript