动态加载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小功能(offsetLeft实现图片滚动效果)实例代码
Nov 28 Javascript
JavaScript初学者建议:不要去管浏览器兼容
Feb 04 Javascript
JQuery动态添加和删除表格行的方法
Mar 09 Javascript
Jquery实现弹性滑块滑动选择数值插件
Aug 08 Javascript
JavaScript中省略元素对数组长度的影响
Oct 26 Javascript
详解jquery easyui之datagrid使用参考
Dec 05 Javascript
Angular directive递归实现目录树结构代码实例
May 05 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
Feb 24 jQuery
微信小程序实现底部导航
Nov 05 Javascript
Vue开发之封装上传文件组件与用法示例
Apr 25 Javascript
JS替换字符串中指定位置的字符(多种方法)
May 28 Javascript
Flexible.js可伸缩布局实现方法详解
Nov 13 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
巧用php中的array_filter()函数去掉多维空值的代码分享
2012/09/07 PHP
PHP flush()与ob_flush()的区别详解
2013/06/03 PHP
基于php判断客户端类型
2016/10/14 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
2014/09/01 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
js编写选项卡效果
2017/05/23 Javascript
小程序实现搜索框
2020/06/19 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
Python中常见的数据类型小结
2015/08/29 Python
Python 登录网站详解及实例
2017/04/11 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
深入浅析Python传值与传址
2018/07/10 Python
python实现简单多人聊天室
2018/12/11 Python
python画微信表情符的实例代码
2019/10/09 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
Links of London官方网站:英国标志性的珠宝品牌
2017/04/09 全球购物
巴西最大的家具及装饰用品店:Mobly
2017/10/11 全球购物
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
运动会演讲稿100字
2014/08/25 职场文书
安全环保演讲稿
2014/08/28 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书
授权委托书协议书
2014/10/16 职场文书
求职自我评价范文
2015/03/09 职场文书
实习证明模板
2015/06/16 职场文书
文明上网主题班会
2015/08/14 职场文书
校运会广播稿
2015/08/19 职场文书
初中信息技术教学反思
2016/02/16 职场文书
php 解析非标准json、非规范json
2021/04/01 PHP
Java elasticsearch安装以及部署教程
2021/06/28 Java/Android
使用springMVC所需要的pom配置
2021/09/15 Java/Android
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL
mysql insert 存在即不插入语法说明
2022/03/25 MySQL