动态加载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中双叹号!!作用示例介绍
Sep 21 Javascript
jQuery 中$(this).index与$.each的使用指南
Nov 20 Javascript
jQuery Raty 一款不错的星级评分插件
Aug 24 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
Sep 21 Javascript
使用jquery.qrcode.js生成二维码插件
Oct 17 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
Jan 04 Javascript
微信小程序 新建登录页并实现tabBar隐藏
Jun 13 Javascript
基于daterangepicker日历插件使用参数注意的问题
Aug 10 Javascript
如何更好的编写js async函数
May 13 Javascript
解决vue 绑定对象内点击事件失效问题
Sep 05 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
May 01 Javascript
javascript中的this作用域详解
Jul 15 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的面向对象编程
2006/10/09 PHP
第五章 php数组操作
2011/12/30 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
javascript json2 使用方法
2010/03/16 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
Python中的生成器和yield详细介绍
2015/01/09 Python
Python urls.py的三种配置写法实例详解
2017/04/28 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
Python操作mongodb的9个步骤
2018/06/04 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
Pytorch 使用 nii数据做输入数据的操作
2020/05/26 Python
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
澳大利亚最大的在线美发和美容零售商之一:My Hair Care & Beauty
2019/08/24 全球购物
法国在线药房:1001Pharmacies
2021/03/07 全球购物
校园达人秀策划书
2014/01/12 职场文书
三年级语文教学反思
2014/02/01 职场文书
离婚协议书怎么写
2014/09/12 职场文书
勇敢的心观后感
2015/06/09 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android
vue 自定义组件添加原生事件
2022/04/21 Vue.js
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL