简介

动态加载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. 1-git初体验

    1 准备工作: windows系统下,安装好msysgit  -安装好后,在开始菜单找到Git  > Git bash 2 当前电脑配置用户名 邮箱 $ git config --global ...

  2. ch6-条件渲染(v-if v-else v-else-if key管理可复用元素 v-show )

    1 v-if 1.1 简单使用 <h1 class="h1" v-if="ok">yes</h1> <script> var ...

  3. dmesg和addr2line 定位 segfault

    程序长时间运行崩溃,但是没有保存core dump消息.可以用下面的方法定位出程序出错位置: 1. 用dmesg查找出错的代码段地址 ip 000000000041ccec 发生错误时指令的地址, s ...

  4. Chloe.ORM框架应用实践

    Chloe.ORM 是国人开发的一款数据库访问组件,很是简单易用.目前支持四种主流数据库:SqlServer.MySQL.Oracle,以及Sqlite,作者为这四种数据库划分出了各自对应的组件程序集 ...

  5. 对象反序列化时,抛出java.io.StreamCorruptedException: invalid type code: AC异常

    问题描述:在使用java.io.ObjectInputStream类的readObject()方法去读取包含有序列化了多个(两个及两个以上)类的文件时,当读取到第二个类时,会抛出题目中提到的异常. 原 ...

  6. LINUX 笔记之常用打包压缩命令

    1.将所有.jpg文件打成一个名为all.tar的包 tar -cf all.tar *.gif 2.将所有.gif文件追加到all.tar tar -rf all.tar *.gif 3.更新原来t ...

  7. mybatis返回int类型报null

    解决这个问题,是当查出来为NULL时,结一个默认值,如:0. MySQL: SELECT IFNULL(MAX(id),0)AS sort FROM table Oracle: SELECT nvl( ...

  8. 博客迁移至 http://www.loveli.site

    对于博客园的Markdow 支持太过...,你懂的,  以后博客迁移至:http://www.loveli.site

  9. c++ 类覆盖方法中的协变返回类型

    c++ 类覆盖方法中的协变返回类型 在C++中,只要原来的返回类型是指向类的指针或引用,新的返回类型是指向派生类的指针或引用,覆盖的方法就可以改变返回类型.这样的类型称为协变返回类型(Covarian ...

  10. CodeForces - 385C Bear and Prime Numbers (埃氏筛的美妙用法)

    Recently, the bear started studying data structures and faced the following problem. You are given a ...