避免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文件。

使用限制

  1. 若是异步加载的页面,或是每次以最新的请求加载有重复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"));
  2. 若是需要指定加载顺序,则需要重写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重复加载的问题的更多相关文章

  1. Highcharts error #16: www.highcharts.com/errors/16 js 单例

    一.问题项目某一个页面用的highcharts用来显示一张图表,第一次刷新正常,第二次就出来这个错.1二.解决问题过程在网上找了很多同样是这个错误的解决方案. 第一:加载了highstock.js然后 ...

  2. easyui 页签

    昨天开始搭后台框架,到晚上的时候遇到了一个现在觉得挺可笑但是当时一直很纠结很纠结的问题,这个问题刚刚解决出来,把它拿出来说说,让自己长点儿记性,希望大家不要犯我这个错误啊 在backstage.jsp ...

  3. jquery easyui tab加载内容的几种方法

    转:http://my.oschina.net/u/2331760/blog/391937?fromerr=saqeoxxB jQuery Easyui 的tabs插件有两种方式加载某个tab(标签页 ...

  4. Easyui tabs的herf和content属性

    在backstage.jsp页面中我写了一个方法,用于在指定位置添加面板(id为msg的地方)function addTab(t,h){ if($('#msg').tabs('exists',t)){ ...

  5. jquery easyui Tab 引入页面的问题

    jQuery Easyui 的tabs插件有两种方式加载某个tab(标签页)上的内容:“href远程请求”和“content本地内容”,本文就两种方式的优缺点进行简单分析和思考. 两者特点: href ...

  6. jquery easyui 中tab页添加其他页面,href与content的用法与区别

    //tab页增加 function addPanel(name,url){ var dd = $('#tt').tabs('exists',name); if(dd){ $('#tt').tabs(' ...

  7. 【转】 jquery easyui Tab 引入页面的问题

    原地址:http://blog.csdn.net/superdog007/article/details/8225518 jQuery Easyui 的tabs插件有两种方式加载某个tab(标签页)上 ...

  8. 解决easyui tabs中href无法跨域跳转

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content ...

  9. 浅谈 easyui tabs 的href和content属性

    众所周知,jQuery Easyui 的tabs插件有两种方式加载某个tab(标签页)上的内容:“href远程请求”和“content本地内容”,本文就两种方式的优缺点进行简单分析和思考. 两者特点: ...

随机推荐

  1. 使用dlib基于CNN(卷积神经网络)的人脸检测器来检测人脸

    基于机器学习CNN方法来检测人脸比之前介绍的效率要慢很多 需要先下载一个训练好的模型数据: 地址点击下载 // dlib_cnn_facedetect.cpp: 定义控制台应用程序的入口点. // # ...

  2. Windows PHP 开启opcache的方法

    PHP opcache可以提升性能.Windows PHP 配置 opcache 的方法如下: 1.先检查PHP目录下ext目录中有没有php_opcache.dll,没有的话自己下载(PHP 5.5 ...

  3. ios--->NStimer用法

    NStimer用法 1.初始化 (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL ...

  4. php---> xhprof安装及使用

    xhprof 简介 xhprof是一款网站的性能工具 安装(lnmp) php --ri xhprof #检查php是否有这个扩展 cd xhprof-0.9.4/xhprof-0.9.4/exten ...

  5. 『开源协议』Creative Commons Attribution 3.0 License . 协议的个人理解,并 转载分享 4000个 精美可商用小图标

    为什么会研究 Creative Commons Attribution 3.0 License Creative Commons Attribution 3.0 License 简称 CC3,是 一种 ...

  6. mac如何用quick look预览多个文件或者图片

    1.先选中要查看的多个文件,然后点击 空格键 2.按住 command+return 就可以同时预览多个文件了 如果想全屏预览,则在1中,按住 option+空格键 ,然后再进行2 ,就实现全屏预览了 ...

  7. VUE报表开发

    因为在项目中经常开发一些报表,并且业务.逻辑其实都有大部分的重复部分. 所以将这些常用的模块抽象出来.并且可视化操作.封装成一款报表开发工具. 先看一下项目的一些效果:数据单项绑定 可视化操作: 数据 ...

  8. golang学习笔记(一):包,变量,函数

    欢迎访问我的博客和github! go 语言学习笔记第一弹,来自 gotour ,以后要常写笔记,把自己学习笔记记录下来,就算只是笔记也要多写. 好记性不如烂笔头,也要多锻炼自己的写作能力. 说实话, ...

  9. Codeforces_712_A

    http://codeforces.com/contest/712/problem/A 水题,写出来就看到规律了. #include<iostream> #include<cstri ...

  10. 2018icpc南京网络赛-E AC Challenge(状压+dfs)

    题意: n道题,每道题有ai和bi,完成这道题需要先完成若干道题,完成这道题可以得到分数t*ai+bi,其中t是时间 1s, n<=20 思路: 由n的范围状压,状态最多1e6 然后dfs,注意 ...