动态加载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 相关文章推荐
JavaScript中链式调用之研习
Apr 07 Javascript
jquery无缝向上滚动实现代码
Mar 29 Javascript
表单验证的完整应用案例探讨
Mar 29 Javascript
100个不能错过的实用JS自定义函数
Mar 05 Javascript
jQuery实现页面点击后退弹出提示框的方法
Aug 24 Javascript
JS验证图片格式和大小并预览的简单实例
Oct 11 Javascript
JS回调函数简单用法示例
Feb 09 Javascript
Bootstrap 3 进度条的实现
Feb 22 Javascript
在vue.js中抽出公共代码的方法示例
Jun 08 Javascript
jquery对table做排序操作的实例演示
Aug 10 jQuery
vue 使某个组件不被 keep-alive 缓存的方法
Sep 21 Javascript
vue 实现动态路由的方法
Jul 06 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 和 MYSQL
2006/10/09 PHP
PHP文件上传实例详解!!!
2007/01/02 PHP
用PHPdig打造属于你自己的Google[图文教程]
2007/02/14 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
Yii实现显示静态页的方法
2016/04/25 PHP
php实现等比例不失真缩放上传图片的方法
2016/11/14 PHP
PHP面向对象中new self()与 new static()的区别浅析
2017/08/17 PHP
实例讲解php实现多线程
2019/01/27 PHP
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
实例解析jQuery工具函数
2016/12/01 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
vue实现简单表格组件实例详解
2017/04/16 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
JavaScript 中的12种循环遍历方法【总结】
2018/05/31 Javascript
原生js检测页面加载完毕的实例
2018/09/11 Javascript
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
[32:36]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第二场 12.12
2020/12/16 DOTA
python中使用smtplib和email模块发送邮件实例
2014/04/22 Python
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
Python判断中文字符串是否相等的实例
2018/07/06 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
python如何基于redis实现ip代理池
2020/01/17 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
全球领先的中国制造商品在线批发平台:DHgate
2020/01/28 全球购物
语文教育专业推荐信范文
2013/11/25 职场文书
劳动实践课感言
2014/02/01 职场文书
《猴子种果树》教学反思
2014/04/26 职场文书
暑假学习心得体会
2014/09/02 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript
关于springboot 配置date字段返回时间戳的问题
2021/07/25 Java/Android
Java线程的6种状态与生命周期
2022/05/11 Java/Android