动态加载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下拉菜单语言选项简单实现
Sep 23 Javascript
ie中js创建checkbox默认选中问题探讨
Oct 21 Javascript
解析JavaScript中的不可见数据类型
Dec 02 Javascript
jquery 图片缩放拖动的简单实例
Jan 08 Javascript
对Js OOP编程 创建对象的一些全面理解
Jul 26 Javascript
基于JS实现移动端左滑删除功能
Jul 28 Javascript
three.js实现3D影院的原理的代码分析
Dec 18 Javascript
JavaScript实现简单动态进度条效果
Apr 06 Javascript
微信小程序WebSocket实现聊天对话功能
Jul 06 Javascript
vue组件间的参数传递实例详解
Apr 26 Javascript
原生JS运动实现轮播图
Jan 02 Javascript
多种类型jQuery网页验证码插件代码实例
Jan 09 jQuery
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
php 模拟POST|GET操作实现代码
2010/07/20 PHP
PHP图片处理类 phpThumb参数用法介绍
2012/03/11 PHP
PHP读取文件并可支持远程文件的代码分享
2012/10/03 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
初学prototype,发个JS接受URL参数的代码
2006/09/25 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
2013/11/11 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
jquery datatable后台封装数据示例代码
2014/08/07 Javascript
js获取浏览器基本信息大全
2014/11/27 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
jQuery的框架介绍
2016/05/11 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
Vue+element-ui 实现表格的分页功能示例
2018/08/18 Javascript
Vue 递归多级菜单的实例代码
2019/05/05 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
浅谈JavaScript 声明提升
2020/09/14 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
用python实现对比两张图片的不同
2018/02/05 Python
Python爬虫框架Scrapy实例代码
2018/03/04 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
GLAMGLOW香港官网:明星出镜前的秘密武器
2017/03/16 全球购物
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
读书小明星事迹材料
2014/05/03 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
社区元宵节活动总结
2015/02/06 职场文书
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python