同步异步动态引入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 相关文章推荐
基于jQuery实现表格数据的动态添加与统计的代码
Jan 31 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
May 03 Javascript
jquery访问ashx文件示例代码
Aug 11 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
Aug 12 Javascript
详解JavaScript数组和字符串中去除重复值的方法
Mar 07 Javascript
Vue.js快速入门实例教程
Oct 15 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
Mar 21 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
Sep 20 Javascript
vue 实现Web端的定位功能 获取经纬度
Aug 08 Javascript
在vue中高德地图引入和轨迹的绘制的实现
Oct 11 Javascript
JavaScript实现栈结构Stack过程详解
Mar 07 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
Aug 06 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 显示客户端IP与服务器IP的代码
2010/10/12 PHP
ubuntu12.04使用c编写php扩展模块教程分享
2013/12/25 PHP
单台服务器的PHP进程之间实现共享内存的方法
2014/06/13 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
JS target与currentTarget区别说明
2011/08/28 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
页面装载js及性能分析方法介绍
2014/03/21 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
Java Mybatis框架入门基础教程
2015/09/21 Javascript
jQuery实现仿微软首页感应鼠标变化滑动窗口效果
2015/10/08 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
window.open不被拦截的简单实现代码(推荐)
2016/08/04 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
JS区分Object与Aarry的六种方法总结
2017/02/27 Javascript
Vue.js中组件中的slot实例详解
2017/07/17 Javascript
vue mint-ui学习笔记之picker的使用
2017/10/11 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
JS集合set类的实现与使用方法示例
2019/02/01 Javascript
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
python基础教程之Filter使用方法
2017/01/17 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
2019/06/19 Python
Django通用类视图实现忘记密码重置密码功能示例
2019/12/17 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
pytorch实现seq2seq时对loss进行mask的方式
2020/02/18 Python
浅谈HTML5 Web Worker的使用
2018/01/05 HTML / CSS
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
五四青年节的活动方案
2014/08/20 职场文书
2015年医院工作总结范文
2015/04/09 职场文书
公司放假通知怎么写
2015/04/15 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL