动态加载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 onmousewheel事件多次触发问题解决方法
Oct 17 Javascript
基于javascript实现最简单的选项卡切换效果
May 16 Javascript
JS封装的自动创建表格的实现代码
Jun 15 Javascript
JS获取多维数组中相同键的值实现方法示例
Jan 06 Javascript
详解Node 定时器
Feb 26 Javascript
vue中添加mp3音频文件的方法
Mar 02 Javascript
使用webpack构建应用的方法步骤
Mar 04 Javascript
对Layer UI 模块化的用法详解
Sep 26 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
Feb 16 Javascript
js实现表格数据搜索
Aug 09 Javascript
ant design 日期格式化的实现
Oct 27 Javascript
原生JavaScript实现贪吃蛇游戏
Nov 04 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 Mssql操作简单封装支持存储过程
2009/12/11 PHP
PHP中对用户身份认证实现两种方法
2011/06/04 PHP
让PHP更快的提供文件下载的代码
2012/06/13 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
Javascript - HTML的request类
2007/01/09 Javascript
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
2012/08/06 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
javascript的正则匹配方法学习
2016/02/24 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
Angular4开发解决跨域问题详解
2017/08/28 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
基于vue配置axios的方法步骤
2017/11/09 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
原生js实现购物车
2020/09/23 Javascript
在Python中使用正则表达式的方法
2015/08/13 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
django rest framework使用django-filter用法
2020/07/15 Python
如何将json数据转换为python数据
2020/09/04 Python
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
运动会通讯稿400字
2014/01/28 职场文书
企业总经理职责
2014/02/02 职场文书
创新型城市实施方案
2014/03/06 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
SpringAop日志找不到方法的处理
2021/06/21 Java/Android
Win11无法访问设备和打印机 如何解决页面空白
2022/04/09 数码科技