动态加载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 相关文章推荐
dwr spring的集成实现代码
Mar 22 Javascript
js post方式传递提交的实现代码
May 31 Javascript
jQuery平滑旋转幻灯片特效代码分享
Sep 07 Javascript
jfinal与bootstrap的登录跳转实战演习
Sep 22 Javascript
详解Angular.js的$q.defer()服务异步处理
Nov 06 Javascript
谈谈Vue.js——vue-resource全攻略
Jan 16 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
Mar 06 Javascript
谈谈vue中mixin的一点理解
Dec 12 Javascript
vue 国际化 vue-i18n 双语言 语言包
Jun 07 Javascript
关于Layui Table隐藏列问题
Sep 16 Javascript
Vuex的各个模块封装的实现
Jun 05 Javascript
vue实现tab栏点击高亮效果
Aug 19 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新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
php防止伪造数据从地址栏URL提交的方法
2014/08/24 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
PHP获取当前系统时间的方法小结
2018/10/03 PHP
日期函数扩展类Ver0.1.1
2006/09/07 Javascript
event.srcElement 用法笔记e.target
2009/12/18 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
js类的继承定义与用法分析
2019/06/21 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
2020/07/20 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
wxPython 入门教程
2008/10/07 Python
python使用cookie库操保存cookie详解
2014/03/03 Python
Python单例模式的两种实现方法
2017/08/14 Python
Python变量赋值的秘密分享
2018/04/03 Python
在Python中居然可以定义两个同名通参数的函数
2019/01/31 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
Python装饰器结合递归原理解析
2020/07/02 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
毕业生自荐书
2014/02/02 职场文书
2014财务人员自我评价范文
2014/09/21 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
最感人的道歉情书
2015/05/12 职场文书
我的1919观后感
2015/06/03 职场文书
MySQL count(*)统计总数问题汇总
2022/09/23 MySQL