动态加载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 相关文章推荐
JS通过相同的name进行表格求和代码
Aug 18 Javascript
jquery实现模拟百分比进度条渐变效果代码
Oct 29 Javascript
关于JavaScript 原型链的一点个人理解
Jul 31 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
Sep 20 Javascript
js判断文件格式及大小的简单实例(必看)
Oct 11 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
Feb 17 Javascript
详解express使用vue-router的history踩坑
Jun 05 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
Oct 23 Javascript
如何在postman中添加cookie信息步骤解析
Jun 30 Javascript
vue 判断元素内容是否超过宽度的方式
Jul 29 Javascript
如何利用js在两个html窗口间通信
Apr 27 Javascript
vue实现锚点定位功能
Jun 29 Vue.js
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
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
2016/12/25 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
微信小程序商品详情页规格属性选择示例代码
2017/10/30 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
mpvue小程序循环动画开启暂停的实现方法
2019/05/15 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
JavaScript this关键字的深入详解
2021/01/14 Javascript
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
Python字符串格式化
2015/06/15 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
python实现杨氏矩阵查找
2019/03/02 Python
python3安装OCR识别库tesserocr过程图解
2020/04/02 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
2020/08/27 Python
Python requests上传文件实现步骤
2020/09/15 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
详解基于canvas的视频遮罩插件
2018/01/04 HTML / CSS
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
英文简历中的自我评价
2013/10/06 职场文书
给幼儿园老师的表扬信
2014/01/19 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
庆七一晚会主持词
2015/06/30 职场文书
四群教育工作总结
2015/08/10 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
使用Redis实现实时排行榜功能
2021/07/02 Redis
python非标准时间的转换
2021/07/25 Python
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers