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


Posted in Javascript onAugust 15, 2013

动态加载script到页面大约有俩方法

第一种就是利用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'并不能工作的很好,理论上状态的变化是如下步骤:
0 uninitialized
1 loading
2 loaded
3 interactive
4 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 相关文章推荐
滚动经典最新话题[prototype框架]下编写
Oct 03 Javascript
uploadify 3.0 详细使用说明
Jun 18 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
Dec 01 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
Jun 17 Javascript
获取jqGrid中选择的行的数据
Nov 30 Javascript
JS实现类似百叶窗下拉菜单效果
Dec 30 Javascript
利用node.js本地搭建HTTP服务器
Apr 19 Javascript
ES6正则表达式的一些新功能总结
May 09 Javascript
webpack vue项目开发环境局域网访问方法
Mar 20 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
Aug 25 Javascript
vue实现员工信息录入功能
Jun 11 Javascript
webpack介绍使用配置教程详解webpack介绍和使用
Jun 25 Javascript
js string 转 int 注意的问题小结
Aug 15 #Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
Aug 15 #Javascript
js控制表单操作的常用代码小结
Aug 15 #Javascript
固定网页背景图同时保持图片比例的思路代码
Aug 15 #Javascript
jQuery UI 实现email输入提示实例
Aug 15 #Javascript
javascript中如何处理引号编码&amp;#034;
Aug 15 #Javascript
Jquery中val()表单取值赋值的实例代码
Aug 15 #Javascript
You might like
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
PHP异常处理浅析
2015/05/12 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
如何优雅的使用 laravel 的 validator验证方法
2018/11/11 PHP
jquery之empty()与remove()区别说明
2010/09/10 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
js onload处理html页面加载之后的事件
2013/10/30 Javascript
js 实现浏览历史记录示例
2014/04/20 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
javascript常用函数(1)
2015/11/04 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
element UI upload组件上传附件格式限制方法
2018/09/04 Javascript
改变layer confirm弹窗按钮的颜色方法
2019/09/12 Javascript
vue-cli3.X快速创建项目的方法步骤
2019/11/14 Javascript
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
vue3+typescript实现图片懒加载插件
2020/10/26 Javascript
使用Mock.js生成前端测试数据
2020/12/13 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
python中bisect模块用法实例
2014/09/25 Python
简单说明Python中的装饰器的用法
2015/04/24 Python
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
Python利用公共键如何对字典列表进行排序详解
2018/05/19 Python
Cinque网上商店:德国服装品牌
2019/03/17 全球购物
名词解释型面试题(主要是网络)
2013/12/27 面试题
医药代表个人的求职信分享
2013/12/08 职场文书
工程材料采购方案
2014/05/18 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
民主评议党员工作总结
2014/10/20 职场文书
实习护士自荐信
2015/03/25 职场文书
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电