动态加载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 相关文章推荐
传递参数的标准方法(jQuery.ajax)
Nov 19 Javascript
JavaScript 判断指定字符串是否为有效数字
May 11 Javascript
表头固定(利用jquery实现原理介绍)
Nov 08 Javascript
AngularJS模块管理问题的非常规处理方法
Apr 29 Javascript
javascript中attachEvent用法实例分析
May 14 Javascript
移除AngularJS下URL中的#字符的方法
Jun 19 Javascript
js闭包所用的场合以及优缺点分析
Jun 22 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
Aug 16 Javascript
javascript 数组去重复(在线去重工具)
Dec 17 Javascript
JavaScript 中的 this 工作原理
Jun 20 Javascript
axios 实现post请求时把对象obj数据转为formdata
Oct 31 Javascript
如何使用Javascript中的this关键字
May 28 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
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
基于PHP Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
win平台安装配置Nginx+php+mysql 环境
2016/01/12 PHP
php 如何获取文件的后缀名
2016/06/05 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
php中使用websocket详解
2016/09/23 PHP
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
2016/07/01 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
jquery判断类型是不是number类型的实例代码
2016/10/07 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
javascript实现移动端上传图片功能
2020/08/18 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
python数据结构之列表和元组的详解
2017/09/23 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
搞定这套Python爬虫面试题(面试会so easy)
2019/04/03 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
2019/07/11 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
Python定义函数实现累计求和操作
2020/05/03 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
外贸学院会计专业应届生求职信
2013/11/14 职场文书
自动化专业个人求职信范文
2013/11/29 职场文书
幼儿园义卖活动方案
2014/01/17 职场文书
教学器材管理制度
2014/01/26 职场文书
现金出纳岗位职责
2014/03/15 职场文书
简历自我评价优缺点
2015/03/11 职场文书
超强台风观后感
2015/06/09 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书