同步异步动态引入js文件的几种方法总结


Posted in Javascript onSeptember 23, 2016

动态加载js文件

有时候我们需要根据参数不同来引入不同的js文件,用html直接写标签满足不了我们的需求,总结几种方法,以及同步异步加载的各种需求

一.直接加载

<div id="divId"></div>
<script>

二.异步加载,并发执行,但引入js内容不能直接使用

//1.1 直接document.write
 document.write("<script src='test.js'><\/script>"); 
//1.2 动态改变已有script的src属性
 //页面中有<script src='' id="s1"></ script> 
document.getElementById('s1').src="test.js";
 //1.3 动态创建js
 var rootObject=document.getElementById("divId");
 var oScript = document.createElement( "script" );
 oScript.type = "text/javascript"; 
 oScript.src = test.js; //test.js方法中有一个方法function test(){alert("test");}
 rootObject.appendChild(oScript); 
 //2.0 调用js
 test();//在ie中不会出错,在firefox会出错,因为firefox默认为异步加载(在向服务器请求加载test.js文件的同时,继续向下执行了,调用test()方法,就自然找不到这个方法)

三.同步加载,单步加载,引入js内容可以直接使用

var Skip={};
//获取XMLHttpRequest对象(提供客户端同http服务器通讯的协议)
Skip.getXmlHttpRequest=function (){ 
 if ( window.XMLHttpRequest ) // 除了IE外的其它浏览器
 return new XMLHttpRequest() ; 
 else if ( window.ActiveXObject ) // IE 
return new ActiveXObject("MsXml2.XmlHttp") ; 
},
//导入内容
Skip.includeJsText =function (rootObject,jsText){ 
 if ( rootObject != null ){ 
 var oScript = document.createElement( "script" );
 oScript.type = "text/javascript"; 
//oScript.id = sId; 
//oScript.src = fileUrl; 
//oScript.defer = true; 
oScript.text = jsText; 
rootObject.appendChild(oScript); 
//alert(oScript.text);
 } 
 },
//导入文件
Skip.includeJsSrc =function (rootObject, fileUrl){ 
 if ( rootObject != null ){ 
 var oScript = document.createElement( "script" ); 
 oScript.type = "text/javascript"; 
 oScript.src = fileUrl; 
 rootObject.appendChild(oScript); 
 } 
},
//同步加载
Skip.addJs=function(rootObject, url){ 
 var oXmlHttp = Skip.getXmlHttpRequest() ; 
 oXmlHttp.onreadystatechange = function(){//其实当在第二次调用导入js时,因为在浏览器当中存在这个*.js文件了,它就不在访问服务器,也就不在执行这个方法了,这个方法也只有设置成异步时才用到
if ( oXmlHttp.readyState == 4 ){ //当执行完成以后(返回了响应)所要执行的
 if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 ){ //200有读取对应的url文件,404表示不存在这个文件
 Skip.includeJsSrc( rootObject, url); 
 } else{ 
 alert( 'XML request error: ' + oXmlHttp.statusText + ' (' + oXmlHttp.status + ')' ) ; 
 } 
} 
} 
//1.True 表示脚本会在 send() 方法之后继续执行,而不等待来自服务器的响应,并且在open()方法当中有调用到onreadystatechange()这个方法。通过把该参数设置为 "false",可以省去额外的 onreadystatechange 代码,它表示服务器返回响应后才执行send()后面的方法.
//2.同步执行oXmlHttp.send()方法后oXmlHttp.responseText有返回对应的内容,而异步还是为空,只有在oXmlHttp.readyState == 4时才有内容,反正同步的在oXmlHttp.send()后的操作就相当于oXmlHttp.readyState == 4下的操作,它相当于只有了这一种状态.
oXmlHttp.open('GET', url, false); //url为js文件时,ie会自动生成 '<script src="*.js" type="text/javascript"> </scr ipt>',ff不会 
oXmlHttp.send(null); 
Skip.includeJsText(rootObject,oXmlHttp.responseText);
}
};
var rootObject=document.getElementById("divId");
Skip.addJs(rootObject,"test.js")//test.js文件中含有funciotn test(){alert("test");}
test();//即使马上调用也不会出错了.
</script>

总结:

1. ie动态加载js文件时,它默认就为同步,可以不用设置同步(也可直调用Skip.includeJsSrc())

2. ff动态加载js文件时,它默认为异步,要设置成同步,加载完直接调用才不会出错

3. 无论ie还是ff在动态加载js内容时,没有请求服务器,不会存在异步问题

注:无论ie还是ff在页面加载js时(即执行整个页面),都是为同步的加载,除非设置script的属性defer="true"(此属性好像也只是对ie有效)

以上就是小编为大家带来的同步异步动态引入js文件的几种方法总结的全部内容了,希望对大家有所帮助,多多支持三水点靠木~

Javascript 相关文章推荐
JavaScript中去掉数组中的重复值的实现方法
Aug 03 Javascript
20行代码实现的一个CSS覆盖率测试脚本
Jul 07 Javascript
jquery ajax 局部无刷新更新数据的实现案例
Feb 08 Javascript
jQuery实现设置、移除文本框默认值功能
Jan 13 Javascript
javascript创建动态表单的方法
Jul 25 Javascript
jQuery动画效果实现图片无缝连续滚动
Jan 12 Javascript
JS中Eval解析JSON字符串的一个小问题
Feb 21 Javascript
微信小程序之发送短信倒计时功能
Aug 30 Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
May 23 Javascript
vue-router 源码实现前端路由的两种方式
Jul 02 Javascript
vue 中 命名视图的用法实例详解
Aug 14 Javascript
简单了解JavaScript作用域
Jul 31 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
Sep 23 #Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
Sep 23 #Javascript
form表单转Json提交的方法(推荐)
Sep 23 #Javascript
关于验证码在IE中不刷新的快速解决方法
Sep 23 #Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
Sep 23 #Javascript
使用bootstrap实现多窗口和拖动效果
Sep 22 #Javascript
web 前端常用组件之Layer弹出层组件
Sep 22 #Javascript
You might like
PHP 飞信好友免费短信API接口开源版
2010/07/22 PHP
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
2013/06/13 PHP
cakephp常见知识点汇总
2017/02/24 PHP
PHP PDOStatement::fetchAll讲解
2019/01/31 PHP
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
详解javascript高级定时器
2015/12/31 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
Vue数据监听方法watch的使用
2018/03/28 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
2020/11/20 Javascript
[10:21]2018DOTA2国际邀请赛寻真——Winstrike
2018/08/11 DOTA
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
简析Python的闭包和装饰器
2016/02/26 Python
python 借助numpy保存数据为csv格式的实现方法
2018/07/04 Python
Python异常处理例题整理
2019/07/07 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
医学专业毕业生个人的求职信
2013/12/04 职场文书
校园元旦活动总结
2014/07/09 职场文书
庆祝国庆节演讲稿2014
2014/09/19 职场文书
高中生毕业评语
2014/12/30 职场文书
具结保证书范本
2015/05/11 职场文书
六种css3实现的边框过渡效果
2021/04/22 HTML / CSS