避免js重复加载的问题
避免js重复加载的问题
在日常开发中,一个页面加载另一个页面的时候,就会把另一个页面的js也会加载进来,那么如何才能避免被加载页面不再重复加载已经加载过的js呢?
先上代码
动态加载js
// 加载js
function loadJS(url, callback) {
var script = document.createElement('script'),
fn = callback || function () { };
script.type = 'text/javascript';
//IE
if (script.readyState) {
script.onreadystatechange = function () {
if (script.readyState == 'loaded' || script.readyState == 'complete') {
script.onreadystatechange = null;
fn();
}
};
} else {
//其他浏览器
script.onload = function () {
fn();
};
}
script.src = url;
document.getElementsByTagName('head')[0].appendChild(script);
}
去除已经加载的js
// 去除已经加载的js
function removeDoubleJS(path) {
var script = $("script[src='"+path+"']");
if(script.length > 0){
script.remove();
}else {
// 加载未加载过的js
loadJS(path);
}
}
核心代码如上,先判断页面中是否已经加载了path路径的js文件,若加载了不再加载此path路径的js文件。
使用限制
若是异步加载的页面,或是每次以最新的请求加载有重复js的页面(比如 jq的load()方法,请求时加了时间戳),则不能单独用script标签去引用外部js,
<script src="xxxx/xxx.js"></script>
,应该动态加载重复的js。例子
<!-- 重复的js不能直接通过外部引入-->
<script src="js/my.js"></script>
<!-- 正确做法:动态加载js-->
removeDoubleJS("js/my.js");
<!-- 若使用jq-->
window.jQuery && $(document).delegate($(document),"hover",removeDoubleJS("js/my.js"));
若是需要指定加载顺序,则需要重写removeDoubleJS(path)的方法,比如传参传多一个回调函数,并且将loadJS进行嵌套。loadJS嵌套如下:
<script type="text/javascript">
loadJS("js/my.js", function (){
loadJS("js/jquery.min.js", function () {
loadJS("js/bootstrap.min.js", alert("success"));
});
});
</script>
导入bootstrap前需要先导入jq,用callback回调函数解决动态加载js无法确定顺序的问题,当然,如果重复加载的js顺序不重要,则不需要重写removeDoubleJS的方法,cv大法直接用(手动滑稽)。
具体实例
<script>
// 动态加载jq
!window.jQuery && loadJS("js/jquery.min.js");
// 动态加载外部js
// window,onload是为了让重复加载的js在原页面使用
window.onload = function(){
keyDown();
window.jQuery && $(document).delegate($(document),"hover",removeDoubleJS("js/my.js"));
};
// 在被加载的页面中判断此js是否已经加载过了
window.jQuery && keyDown();
window.jQuery && $(document).delegate($(document),"hover",removeDoubleJS("js/my.js"));
function keyDown() {
window.jQuery && $(document).delegate($(document),"click",function(event){
if(event.keyCode==13){
$("#login-button").click();
}
});
}
</script>
注意:window,onload
是为了让重复加载的js在原页面中使用 ,并且需要在window,onload
外面再调用一次方法。若使用jq,又要防止重复加载jq,则需要通过!window.jQuery && loadJS("js/jquery.min.js");
加载jq,并且需要调用jq的delegate
函数来保证在jq加载后才使用jq的方法。
delegate()方法的链接:https://www.w3school.com.cn/jquery/event_delegate.asp
避免js重复加载的问题的更多相关文章
- Highcharts error #16: www.highcharts.com/errors/16 js 单例
一.问题项目某一个页面用的highcharts用来显示一张图表,第一次刷新正常,第二次就出来这个错.1二.解决问题过程在网上找了很多同样是这个错误的解决方案. 第一:加载了highstock.js然后 ...
- easyui 页签
昨天开始搭后台框架,到晚上的时候遇到了一个现在觉得挺可笑但是当时一直很纠结很纠结的问题,这个问题刚刚解决出来,把它拿出来说说,让自己长点儿记性,希望大家不要犯我这个错误啊 在backstage.jsp ...
- jquery easyui tab加载内容的几种方法
转:http://my.oschina.net/u/2331760/blog/391937?fromerr=saqeoxxB jQuery Easyui 的tabs插件有两种方式加载某个tab(标签页 ...
- Easyui tabs的herf和content属性
在backstage.jsp页面中我写了一个方法,用于在指定位置添加面板(id为msg的地方)function addTab(t,h){ if($('#msg').tabs('exists',t)){ ...
- jquery easyui Tab 引入页面的问题
jQuery Easyui 的tabs插件有两种方式加载某个tab(标签页)上的内容:“href远程请求”和“content本地内容”,本文就两种方式的优缺点进行简单分析和思考. 两者特点: href ...
- jquery easyui 中tab页添加其他页面,href与content的用法与区别
//tab页增加 function addPanel(name,url){ var dd = $('#tt').tabs('exists',name); if(dd){ $('#tt').tabs(' ...
- 【转】 jquery easyui Tab 引入页面的问题
原地址:http://blog.csdn.net/superdog007/article/details/8225518 jQuery Easyui 的tabs插件有两种方式加载某个tab(标签页)上 ...
- 解决easyui tabs中href无法跨域跳转
<!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content ...
- 浅谈 easyui tabs 的href和content属性
众所周知,jQuery Easyui 的tabs插件有两种方式加载某个tab(标签页)上的内容:“href远程请求”和“content本地内容”,本文就两种方式的优缺点进行简单分析和思考. 两者特点: ...
随机推荐
- Java容器解析系列(15) HashTable Dictionary & Properties
HashTable的实现原理与HashMap没有什么区别; 其与HashMap的主要区别如下: 添加进入jdk时间:HashTable在jdk1.0时添加,HashMap在jdk1.2时添加; 类签名 ...
- vue-cli3 axios解决跨域问题
这种错误就是跨域问题: 我百度了各种方法,最终下面这种方法解决了,直接上代码: 解决: 如果没安装axios: npm install axios -save //安装axios main.js / ...
- [集训]Trominoes,钩子公式运用
题意 用这四种骨牌密铺n*m的正方形矩阵,可以不选,求方案数.n*m<=1E8.多组询问. 思考 用如上的表达难以进行计算,尝试转化为一种新的组合解释. 若从右上角开始填起,我们强制要求里面的轮 ...
- IIS发布网站常见MIME扩展类型添加
# This file maps Internet media types to unique file extension(s). # Although created for httpd, thi ...
- Spring注解开发系列专栏
这个系列主要是讲Spring注解的使用,可以为后面SpringBoot的学习带来一定的帮助.我觉得从Spring直接过度到SpringBoot还是有点快,还是得需要一个演变的过程.从Spring开发, ...
- windows配置Lua开发环境
官网上下载的不靠谱,很多库不能用,你如 require "socket" 如果没有vc那些编译也麻烦,摸索了很久,直接下载安装文件安装即可: 安装这两个就行: 先安装C++2005 ...
- JVM基础快速入门篇
Java是一门可以跨平台的语言,但是Java本身是不可以实现跨平台的,需要JVM实现跨平台.javac编译好后的class文件,在Windows.Linux.Mac等系统上,只要该系统安装对应的Jav ...
- 三、Django学习之单表查询接口
查询接口 all() 查询所有结果,结果是queryset类型 filter(**kwargs) and条件关系:参数用逗号分割表示and关系 models.Student.objects.filte ...
- CassandraAppender - distributed logging,分布式软件logback-appender
农历年最后一场scala-meetup听刘颖分享专业软件开发经验,大受启发.突然意识到一直以来都没有完全按照任何标准的开发规范做事.诚然,在做技术调研和学习的过程中不会对规范操作有什么严格要求,一旦技 ...
- LUA提取免费迅雷账号
--获取http://www.521xunlei.com/ 免费迅雷账号 function getPageid() local http = require("socket.http&quo ...