动态加载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 相关文章推荐
Mootools 1.2教程 滑动效果(Slide)
Sep 15 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
Oct 24 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
May 30 Javascript
浅谈jquery点击label触发2次的问题
Jun 12 Javascript
ES6中参数的默认值语法介绍
May 03 Javascript
jQuery实现的弹幕效果完整实例
Sep 06 jQuery
在Vue项目中引入腾讯验证码服务的教程
Apr 03 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
Jul 12 Javascript
vue-cli3+typescript初体验小结
Feb 28 Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
May 28 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
Dec 09 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
May 31 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下通过POST还是GET来传值
2008/06/05 PHP
延长phpmyadmin登录时间的方法
2011/02/06 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
PHP+jQuery实现自动补全功能源码
2013/05/15 PHP
自己写了一个php检测文件编码的函数
2014/04/21 PHP
PHP防盗链代码实例
2014/08/27 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
基于php判断客户端类型
2016/10/14 PHP
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
Position属性之relative用法
2015/12/14 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
2016/07/05 Javascript
Bootstrap BootstrapDialog使用详解
2017/02/17 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
2017/03/13 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
Vue实现剪贴板复制功能
2019/12/31 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
pandas 对group进行聚合的例子
2019/12/27 Python
Python自省及反射原理实例详解
2020/07/06 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
python高级特性简介
2020/08/13 Python
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
实习生个人找工作的自我评价
2013/10/30 职场文书
市场营销专业推荐信
2013/11/03 职场文书
端午节粽子促销活动方案
2014/02/02 职场文书
档案室主任岗位职责
2014/02/12 职场文书
全陪导游词开场白
2015/05/29 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书