同步异步动态引入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连接access数据库的方法
Nov 17 Javascript
基于jQuery的360图片展示实现代码
Jun 14 Javascript
引用外部js乱码问题分析及解决方案
Apr 12 Javascript
在jQuery中 关于json空对象筛选替换
Apr 15 Javascript
js实现的复制兼容chrome和IE
Apr 03 Javascript
javascript实现倒计时(精确到秒)
Jun 26 Javascript
javascript日期格式化方法小结
Dec 17 Javascript
Javascript获取图片原始宽度和高度的方法详解
Sep 20 Javascript
12个非常有用的JavaScript技巧
May 17 Javascript
mpvue写一个CPASS小程序的示例
Sep 04 Javascript
JavaScript实现表单注册、表单验证、运算符功能
Oct 15 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
Jan 20 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对象Object的概念 介绍
2012/06/14 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
php 使用file_get_contents读取大文件的方法
2014/11/13 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
javascript使用activex控件的代码
2011/01/27 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
ExtJS下 Ext.Direct加载和提交过程排错小结
2013/04/02 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
详解JavaScript中的表单验证
2015/06/16 Javascript
Node.js的npm包管理器基础使用教程
2016/05/26 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
jQuery实现火车票买票城市选择切换功能
2017/09/15 jQuery
React Native 真机断点调试+跨域资源加载出错问题的解决方法
2018/01/18 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
[06:16]第十四期-国士无双绝地翻盘之撼地神牛
2014/06/24 DOTA
[03:43]2014DOTA2西雅图国际邀请赛 newbee战队巡礼
2014/07/07 DOTA
Python3基础之基本数据类型概述
2014/08/13 Python
Python变量作用范围实例分析
2015/07/07 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
python dict如何定义
2020/09/02 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
canvas学习笔记之绘制简单路径
2019/01/28 HTML / CSS
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
小学教育毕业生自荐信
2013/11/18 职场文书
支部鉴定材料
2014/06/02 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书
简短清晨问候语
2015/11/10 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers