同步异步动态引入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 相关文章推荐
js实现数组去重、判断数组以及对象中的内容是否相同
Nov 29 Javascript
jquery 使用简明教程
Mar 05 Javascript
JQuery设置时间段下拉选择实例
Dec 30 Javascript
JQuery显示隐藏DIV的方法及代码实例
Apr 16 Javascript
javascript检查浏览器是否已经启用XX功能
Jul 10 Javascript
jQuery 选择器(61种)整理总结
Sep 26 Javascript
详解Vue前端对axios的封装和使用
Apr 01 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
Sep 06 Javascript
ant-design-vue 快速避坑指南(推荐)
Jan 21 Javascript
Vue页面跳转传递参数及接收方式
Sep 09 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
Dec 19 Vue.js
vue实现Toast组件轻提示
Apr 10 Vue.js
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动态图像的创建
2006/10/09 PHP
dedecms系统常用术语汇总
2007/04/03 PHP
PHP资源管理框架Assetic简介
2014/06/12 PHP
php远程下载类分享
2016/04/13 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
window.parent与window.openner区别介绍
2012/04/12 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
javascript基本语法
2016/05/31 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
AngularJS之依赖注入模拟实现
2016/08/19 Javascript
深入理解node.js http模块
2018/01/24 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
2018/07/19 Javascript
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
解决VUE双向绑定失效的问题
2019/10/29 Javascript
Python编码类型转换方法详解
2016/07/01 Python
视觉直观感受若干常用排序算法
2017/04/13 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
python实现飞机大战项目
2020/03/11 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
python把一个字符串切开的实例方法
2020/09/27 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
Python字典dict常用方法函数实例
2020/11/09 Python
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
Armor Lux法国官方网站:水手服装、成衣和内衣
2020/05/26 全球购物
自我鉴定 电子商务专业
2014/01/30 职场文书
平安工地建设方案
2014/05/06 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
python开发制作好看的时钟效果
2022/05/02 Python
Python中requests库的用法详解
2022/06/05 Python