简介

动态加载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. 【转】Python-__builtin__与__builtins__的区别与关系(超详细,经典)

    在学习Python时,很多人会问到__builtin__.__builtins__和builtins之间有什么关系.百度或Google一下,有很 多答案,但是这些答案要么不准确,要么只说了一点点,并不 ...

  2. javascript中call()、apply()、bind()的用法终于理解

    其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例1 obj.objAge;  //17 obj.myFun()  //小张年龄undefined 例2 shows( ...

  3. jS判断浏览器终端

    在做移动端项目的时候,常常会遇到需要判断页面浏览终端的需求.要想判断是什么浏览器终端,先打印 navigator.userAgent 出来.所以收集了几种比较常用的方法: if(/(iPhone|iP ...

  4. sql2008 发送邮件

    --"管理"-"数据库邮件"-右键"配置数据库右键" Exec msdb.dbo.sp_send_dbmail @profile_name= ...

  5. SQL server 数据库备份大

    首先简单的介绍一下Sql server 备份的类型有: 1:完整备份(所有的数据文件和部分的事务日志文件) 2:差异备份(最后一次完成备份后数据库改变的部分) 3:文件和文件组备份(对指定的文件和文件 ...

  6. php设计模式 工厂模式和单例模式

    一.单例模式//让该类在外界无法造对象//让外界可以造一个对象,做一个静态方法返回对象//在类里面通过让静态变量控制返回对象只能是一个. 单例模式的要点有三个: 一是某个类只能有一个实例: 二是它必须 ...

  7. WDA的配置

    WDA的配置 SAP的技术总是搞得很复杂,WDA的涉及到配置如下: 1. Internet Communication Manager 确认ICM中提供的HTTP/HTTPS运行正常. Tcode: ...

  8. Linux命令-基本命令(1)

    1. ll dfdfdfd 2. vi dfffd

  9. Object类—复写equals方法,hashCode方法,toString方法

    Object:所有类的根类. Object是不断抽取而来,具备着所有对象都具备的共性内容. class Person extends Object { private int age; Person( ...

  10. MySQL简概

    MySQL简介与概要 mysql 是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,现在已经被sun公司收购,支持FreeBSD.Linux.MAC.windows等多种操作系统.相比 ...