同步异步动态引入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温习的一些笔记 基础常用知识小结
Jun 22 Javascript
JQuery入门——事件切换之hover()方法应用介绍
Feb 05 Javascript
JS中的prototype与面向对象的实例讲解
May 22 Javascript
JS实现的省份级联实例代码
Jun 24 Javascript
仿谷歌主页js动画效果实现代码
Jul 14 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
Dec 20 Javascript
简述AngularJS的控制器的使用
Jun 16 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
Dec 23 Javascript
input点击后placeholder中的提示消息消失
Jan 15 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
Apr 18 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
Mar 07 Javascript
手挽手带你学React之React-router4.x的使用
Feb 14 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+mysql 实现身份验证代码
2010/03/24 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
理解javascript中的原型和原型链
2015/07/30 Javascript
快速入门Vue
2016/12/19 Javascript
拖动时防止选中
2017/02/03 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
vue-cli项目中使用Mockjs详解
2018/05/14 Javascript
Rollup处理并打包JS文件项目实例代码
2018/05/31 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
2018/08/12 Javascript
浅谈react性能优化的方法
2018/09/05 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
python实现文件分组复制到不同目录的例子
2014/06/04 Python
简单介绍Ruby中的CGI编程
2015/04/10 Python
Python常用知识点汇总
2016/05/08 Python
python之Socket网络编程详解
2016/09/29 Python
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
树莓派安装OpenCV3完整过程的实现
2019/10/10 Python
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
德国柯吉澳趣味家居:Koziol
2017/08/24 全球购物
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
eBay爱尔兰站:eBay.ie
2019/08/09 全球购物
日本动漫周边服饰销售网站:Atsuko
2019/12/16 全球购物
Prototype如何更新局部页面
2013/03/03 面试题
创先争优制度
2014/01/21 职场文书
应用化学专业职业生涯规划书
2014/01/22 职场文书
省级优秀毕业生主要事迹
2014/05/29 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
图书借阅制度范本
2015/08/06 职场文书
中考百日冲刺决心书
2015/09/22 职场文书
文艺委员竞选稿
2015/11/19 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书