简介

动态加载js,css在现在以及将来肯定是很重要的。目前来看前端代码编写的业务量已经远远超过后端编写的。随着对用户体验度逐渐增强,前端业务复杂,加载速度变得很慢很慢。为了解决这个问题,目前出现的两个前端模块加载器为require.js与sea.js,这两款模块加载器都不错。但是呢,有时候我仅仅需要的只是动态加载一个js,不需要把代码模块化,那我们只能自己手写一个加载函数。

简单的加载js

/**
* HTML动态加载js
* @path {String} src地址必须带有后缀名.js
* */
function addJs(path){
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.src = path;
script.type = 'text/javascript';
head.appendChild(script);
}

这段代码已经满足我们需求,动态加载js。随之问题又来了,假设某一个前端小白不知道你加载了没有,又加载了一次,这样就是浪费流量,时间,还有可能造成一些问题。现在我来优化一下。

次佳的加载js

/**
* HTML动态加载js
* @path {String} src地址必须带有后缀名.js
* */
var cache=[];
function addJs(path){
var flag=0;//检查是否加载的状态
for(var i=cache.length;i--;){
cache[i]==path?flag=1:flag=0;
}
if(flag){//如果已经加载则不加载
return;
}
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.src = path;
script.type = 'text/javascript';
head.appendChild(script);
cache.push(path);//把加载过的存起来
}

一天线上又出现bug了,结果一看是因为动态加载的js导致,因为只加载了,由于加载的js文件过大,导致还没加载成功,下边就开始使用了。下面在完善一下。

不错的加载js

/**
* HTML动态加载js
* @path {String} src地址必须带有后缀名.js
* @callback {Function} 加载成功的回掉函数
* */
var cache=[];
function addJs(path,callback){
var flag=0;//检查是否加载的状态
for(var i=cache.length;i--;){
cache[i]==path?flag=1:flag=0;
}
if(flag){//如果已经加载则不加载
return;
}
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.src = path;
script.type = 'text/javascript';
head.appendChild(script);
script.onload = script.onreadystatechange = function() {/*判断是否加载成功*/
if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete" ) {
script.onload = script.onreadystatechange = null;
callback();
}
};
cache.push(path);//把加载过的存起来
}

可以看出现在稍微完善一点,一天技术总监说,首页加载太慢了,js,css都要动态加载。这下我们还需要更改代码,再次优化一下。

推荐使用的动态加载js,css

var addStyleJs = (function(dom) {
var cache = {}, /*缓存加载过的css或者js*/
funct;
/**
* HTML动态加载css或者js
* @path {String} src 或 link 地址必须带有后缀名.js或者.css
* @callback {Function} 加载成功的回掉函数
* */
funct = function(path, callback) {
if(!path) { /*检查路径是否为空*/
throw new Error("请输入path路径!");
};
var fn=Object.prototype.toString.call(callback)=="[object Function]"?callback:function(){};
if(".js" == path.substr(-3)) { /*检查路径后缀名是否为.js*/
addJs(path, fn);
} else if(".css" == path.substr(-4)) { /*检查路径后缀名是否为.css*/
addCss(path, fn);
} else {
throw new Error('请输入正确的path路径!');
}
};
/**
* HTML 动态添加 CSS
* @path {String} link 地址必须带有后缀名.css
* @callback {Function} 加载成功的回掉函数
* */
function addCss(path, callback) {
if(!checkcache(path)) { /*检查是否加载过*/
var head = dom.getElementsByTagName('head')[0];
var link = dom.createElement('link');
link.href = path;
link.rel = 'stylesheet';
link.type = 'text/css';
head.appendChild(link); /*添加到HTML中*/
link.onload = link.onreadystatechange = function() { /*判断是否加载成功*/
if(!this.readyState || this.readyState === "loaded" || this.readyState === "complete") {
link.onload = link.onreadystatechange = null;
callback();
}
};
cache[path] = 1; /*存储加载过的css路径,值设为1*/
}
};
/**
* HTML动态加载js
* @path {String} src 地址必须带有后缀名.js
* @callback {Function} 加载成功的回掉函数
* */
function addJs(path, callback) {
if(!checkcache(path)) { /*检查是否加载过*/
var head = dom.getElementsByTagName('head')[0];
var script = dom.createElement('script');
script.src = path;
script.type = 'text/javascript';
head.appendChild(script); /*添加到HTML中*/
script.onload = script.onreadystatechange = function() { /*判断是否加载成功*/
if(!this.readyState || this.readyState === "loaded" || this.readyState === "complete") {
script.onload = script.onreadystatechange = null;
callback();
}
};
cache[path] = 1; /*存储加载过的js路径,值设为1*/
}
};
/**
* 检查是否加载
* @path {String} 路径
* */
function checkcache(path) {
if(cache[path]) { /*判断是否加载过的js路径*/
return true;
} else {
return false;
}
};
return funct;
}(document));

总结

动态加载js与动态加载css在日常开发中也许会不常用,但是对于我们来说这是必须要会的。代码也许学几天就会写,但是写一段高质量的代码则需要你常常写,常常总结,思考。欢迎大家与我一同进步。如有问题请大家指出哦!

动态加载js css 插件的更多相关文章

  1. js动态加载js css文件,可以配置文件后辍,防止浏览器缓存

    js的引用,在浏览器,或微信上访问经常会遇到文件改了,但就是没有更新的问题,使用此函数可以轻松解决缓存问题只需要把js的引用方式改为使用此函数加载即可 源码如下: /** * js动态加载js css ...

  2. 页面加载异常 清除浏览器静态文件 js css 缓存 js动态加载js css文件,可以配置文件后辍,防止浏览器缓存

    js清除浏览器缓存的几种方法 - 兔老霸夏 - 博客园 https://www.cnblogs.com/Mr-Rocker/p/6031096.html js清除浏览器缓存的几种方法   一.CSS和 ...

  3. 动态加载js,css

    今天项目中需要用到动态加载 CSS 文件,经过一番折腾终于搞定,回家整理了一下,顺便融合了动态加载 JS 的功能写成了一个对象,先上代码: var dynamicLoading = { css: fu ...

  4. JS动态加载 js css

    1.动态加载js function loadScript( url ){ var script = document.createElement( "script" ); scri ...

  5. 动态加载js,css(项目中需要的)

    最近做的一个项目需要加入百度统计,大家都知道百度统计在页面引用就是一坨js,实现方法很简单引用到页面就ok了. 那么问题来了,虽然我不知道百度统计的原理是啥,我的测试服引用了百度统计,百度统计账号里面 ...

  6. jquery动态加载js/css文件方法

    先来看jquery自带的getSrcript文件 方法 代码如下 复制代码 $.getScript(url,callback) 实例 代码如下 复制代码 var testVar = 'New JS l ...

  7. 动态加载js和css

    开发过程中经常需要动态加载js和css,今天特意总结了一下常用的方法. 1.动态加载js 方法一:动态加载js文件 // 动态加载js脚本文件 function loadScript(url) { v ...

  8. 动态加载js和css的jquery plugin

    一个简单的动态加载js和css的jquery代码,用于在生成页面时通过js函数加载一些共通的js和css文件. //how to use the function below: //$.include ...

  9. 关于动态加载js

    已知一个需要动态加载的js的文件路径数组,动态加载数组里面所有的js文件. 加载分两种情况: 1. 并行加载,不管js的执行顺序. 2. 串行加载,即一个一个加载,上一个加载完再加载下一个,直到最后. ...

随机推荐

  1. eclipse的插件开发-启动时间

    今天晚上看<深入理解java虚拟机>时,作者在书中有一段,eclipse优化的章节,其中涉及到了eclipse启动时间检测的插件开发 于是翻了翻资料,也开发了一个自己的插件 如图是开发后启 ...

  2. ZOJ1171

    错误代码先放这 #include<cstdio> #include<cstdlib> #include<iostream> #include<cstring& ...

  3. 百度的js日历

    <title>百度的Js日历,值得一看</title> <style> body,td,.p1,.p2,.i{font-family:arial} body{mar ...

  4. OpenCV中的绘图函数-OpenCV步步精深

    OpenCV 中的绘图函数 画线 首先要为画的线创造出环境,就要生成一个空的黑底图像 img=np.zeros((512,512,3), np.uint8) 这是黑色的底,我们的画布,我把窗口名叫做i ...

  5. elasticsearch单例模式连接

    import java.net.InetAddress;import org.elasticsearch.client.transport.TransportClient;import org.ela ...

  6. win10 uwp 切换主题

    本文主要说如何在UWP切换主题,并且如何制作主题. 一般我们的应用都要有多种颜色,一种是正常的白天颜色,一种是晚上的黑夜颜色,还需要一种辅助的高对比颜色.这是微软建议的,一般应用都要包含的颜色. 我们 ...

  7. hibernate使用注解简化开发

    简述 在编写hibernate的时候,需要将实体类映射到数据库中的表.通常需要一个配置文件(hibernate.cfg.xml),一个实体类(XX.Java),还有一个映射文件(XX.hbm.xml) ...

  8. Prometheus 到底 NB 在哪里?- 每天5分钟玩转 Docker 容器技术(84)

    本节讨论 Prometheus 的核心,多维数据模型.我们先来看一个例子. 比如要监控容器 webapp1 的内存使用情况,最传统和典型的方法是定义一个指标 container_memory_usag ...

  9. 在 JPA、Hibernate 和 Spring 中配置 Ehcache 缓存

    jpa, hibernate 和 spring 时配置 ehcache 二级缓存的步骤. 缓存配置 首先在 persistence.xml 配置文件中添加下面内容: <property name ...

  10. SpringMVC 配置

    1.在WEB-INF\web.xml中定义前端控制器 <servlet> <servlet-name>springmvc</servlet-name> <se ...