动态加载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 相关文章推荐
IE innerHTML,outerHTML所引起的问题
Jun 04 Javascript
jquery $.each() 使用小探
Aug 23 Javascript
javascript中取前n天日期的两种方法分享
Jan 26 Javascript
JavaScript中Date.toSource()方法的使用教程
Jun 12 Javascript
js基于cookie方式记住返回页面用法示例
May 27 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
Dec 22 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
May 18 Javascript
vue 左滑删除功能的示例代码
Jan 28 Javascript
微信小程序实现消息框弹出动画
Apr 18 Javascript
微信小程序实现传递多个参数与事件处理
Aug 12 Javascript
p5.js临摹动态图形的方法
Oct 23 Javascript
js 数组 fill() 填充方法
Nov 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
SONY SRF-40W电路分析
2021/03/02 无线电
PHP+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
2011/10/23 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
PHP基于新浪IP库获取IP详细地址的方法
2017/05/04 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
jquery查找tr td 示例模拟
2014/05/08 Javascript
jQuery实现获取绑定自定义事件元素的方法
2015/12/02 Javascript
JavaScript操作选择对象的简单实例
2016/05/16 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
小程序如何获取多个formId实现详解
2019/09/20 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
销售文员的岗位职责
2013/11/20 职场文书
车间调度岗位职责
2013/11/30 职场文书
管理信息系学生的自我评价
2014/01/11 职场文书
企业申诉管理制度
2014/01/30 职场文书
数控专业自荐书范文
2014/03/16 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
五年级小学生评语
2014/12/26 职场文书
琅琊山导游词
2015/02/05 职场文书
个人求职自荐信范文
2015/03/06 职场文书
2015年三万活动总结
2015/03/25 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
论文致谢词范文
2015/05/14 职场文书
Apache自带的ab压力测试工具的实现
2022/07/23 Servers