动态加载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 相关文章推荐
JScript的条件编译
May 29 Javascript
浅谈javascript中的instanceof和typeof
Feb 27 Javascript
javascript实现简单的全选和反选功能
Jan 05 Javascript
浅谈js中子页面父页面方法 变量相互调用
Aug 04 Javascript
jQuery dataTables与jQuery UI 对话框dialog的使用教程
Sep 02 Javascript
AngularJS 指令的交互详解及实例代码
Sep 14 Javascript
利用js编写响应式侧边栏
Sep 17 Javascript
js关于getImageData跨域问题的解决方法
Oct 14 Javascript
p5.js入门教程之图片加载
Mar 20 Javascript
Vue Promise的axios请求封装详解
Aug 13 Javascript
其实你可以少写点if else与switch(推荐)
Jan 10 Javascript
用vue写一个日历
Nov 02 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
thinkphp 多表 事务详解
2013/06/17 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
php浏览历史记录的方法
2015/03/10 PHP
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
JS实现淘宝幻灯片效果的实现方法
2013/03/22 Javascript
jQuery函数的等价原生函数代码示例
2013/05/27 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
2016/05/23 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
React进阶学习之组件的解耦之道
2017/08/07 Javascript
JavaScript创建对象的常用方式总结
2018/08/10 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
详解在React项目中安装并使用Less(用法总结)
2019/03/18 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
[02:05]2014DOTA2西雅图邀请赛 专访啸天mik夫妻档
2014/07/08 DOTA
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
使用Python自动化破解自定义字体混淆信息的方法实例
2019/02/13 Python
Pytest单元测试框架如何实现参数化
2020/09/05 Python
css3 矩阵的使用详解
2018/03/20 HTML / CSS
Artist Guitars新西兰:乐器在线商店
2017/09/17 全球购物
平面设计的岗位职责
2013/11/08 职场文书
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
团购业务员岗位职责
2014/03/15 职场文书
文明市民先进事迹
2014/05/15 职场文书
应聘护士求职信
2014/07/21 职场文书
委托书的写法
2014/08/30 职场文书
毕业实习感受与体会
2015/05/26 职场文书
PHP策略模式写法
2021/04/01 PHP
python实现过滤敏感词
2021/05/08 Python
python爬取豆瓣电影TOP250数据
2021/05/23 Python