动态加载JavaScript文件的两种方法


Posted in Javascript onApril 22, 2016

这篇文章主要为大家详细介绍了动态加载JavaScript文件的两种方法,感兴趣的小伙伴们可以参考一下
第一种便是利用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'并不能工作的很好,理论上状态的变化是如下步骤:
1.uninitialized
2.loading
3.loaded
4.interactive
5.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文件的方法,希望对大家的学习有所帮助。

Javascript 相关文章推荐
让iframe子窗体取父窗体地址栏参数(querystring)
Oct 13 Javascript
jQuery基础框架浅入剖析
Dec 27 Javascript
基于JavaScript 类的使用详解
May 07 Javascript
jquery操作复选框checkbox的方法汇总
Feb 05 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
Oct 09 Javascript
jQuery实现可拖拽3D万花筒旋转特效
Jan 03 Javascript
MUI  Scroll插件的使用详解
Apr 13 Javascript
3种vue路由传参的基本模式
Feb 22 Javascript
基于打包工具Webpack进行项目开发实例
May 29 Javascript
Vue+webpack+Element 兼容问题总结(小结)
Aug 16 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
Jun 15 Javascript
浅谈bootstrap layer.open中end的使用方法
Sep 12 Javascript
JavaScript记录光标在编辑器中位置的实现方法
Apr 22 #Javascript
在AngularJS中使用jQuery的zTree插件的方法
Apr 21 #Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
Apr 21 #Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
Apr 21 #Javascript
javascript常见数字进制转换实例分析
Apr 21 #Javascript
BootStrap和jQuery相结合实现可编辑表格
Apr 21 #Javascript
动态加载js文件简单示例
Apr 21 #Javascript
You might like
在php中使用sockets:从新闻组中获取文章
2006/10/09 PHP
php include类文件超时问题处理
2015/02/06 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
PHP7引入的&quot;??&quot;和&quot;?:&quot;的区别讲解
2019/04/08 PHP
javascript数组组合成字符串的脚本
2021/01/06 Javascript
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
2012/10/11 Javascript
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
js实现简单的随机点名器
2020/09/17 Javascript
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
Python urlopen()函数 示例分享
2014/06/12 Python
Python标准库与第三方库详解
2014/07/22 Python
python实现文本文件合并
2015/12/29 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
pandas删除指定行详解
2019/04/04 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
Opencv python 图片生成视频的方法示例
2020/11/18 Python
多视角3D可旋转的HTML5 Logo动画
2016/03/02 HTML / CSS
草莓网化妆品日本站:Strawberrynet日本
2017/10/20 全球购物
关于VPN
2012/06/10 面试题
教学实习自我评价
2014/01/28 职场文书
生日宴会主持词
2014/03/20 职场文书
放飞梦想演讲稿200字
2014/08/26 职场文书
会议通知范文
2015/04/15 职场文书
六一儿童节园长致辞
2015/07/31 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
幼儿教师师德培训心得体会
2016/01/09 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python
Win2008系统搭建DHCP服务器
2022/06/25 Servers