动态加载/删除css文件以及图片预加载
 
功能模块页面
 
最近,工作中遇到了一个比较奇葩的需求:要在一个页面(PC端)增加一个功能模块,但是这个页面在不久之后要重构,为了新增加的模块可以继续复用,必须做到这个模块的样式对页面其他模块不能造成影响,旧版页面使用bootstrap样式,新版模块只使用normalize.css,UI组件使用sass重写,因为重构工作量太大,公司前端只有1+1个人,所以就想将模块样式独立,最后,用动态加载link标签解决。
 
上图为一个页面,所有模块通过哈希控制是否显示,新增了一个约标模块。附上自认为很low的解决方放:(欢迎指正不足)
  1. // 添加link标签
  1. this.loadCss = function(url, callback) {
  1. var link = document.createElement('link');
  1. link.type="text/css";
  1. link.rel = "stylesheet";
  1. link.href = url+'1';
  1. document.getElementsByTagName('head')[0].appendChild(link);
  1. if (callback) {
  1. callback.call(link);
  1. }
  1. }
  1. // 通过判断是否为新增模块
  1. if("#" + relId == "#setup_12"){
  1. self.loadCss('/css/v2.0/pc/new_main.css?v=201702231412', function(){
  1. self.$_link = this;
  1. })
  1. self.loadCssComplete('/css/v2.0/pc/new_main.css?v=201702231412', function(){
  1. $("#" + relId).show();  //判断css是够加载完成,如果完成则显示模块
  1. })
  1. }else{
  1. if($.isEmptyObject(self.$_link)){
  1. console.log($.isEmptyObject(self.$_link))
  1. }else{
  1. document.getElementsByTagName('head')[0].removeChild(self.$_link);
  1. self.$_link = new Object();
  1. window.location.reload();  // 在切换tabs时删除link标签并刷新避免缓冲造成影响
  1. }
  1. $("#" + relId).show();
  1. }
将link标签添加到最后,避免bootstrap样式发生覆盖。
特此分享,希望对一些和我一样low的FED有帮助。

附上最近工作中用到的图片资源预加载并显示加载进度条代码:
  1. //构造器函数
  1. function resLoader(config){
  1. this.option = {
  1. resourceType : 'image', //资源类型,默认为图片
  1. baseUrl : './', //基准url
  1. resources : [], //资源路径数组
  1. onStart : null, //加载开始回调函数,传入参数total
  1. onProgress : null, //正在加载回调函数,传入参数currentIndex, total
  1. onComplete : null //加载完毕回调函数,传入参数total
  1. }
  1. if(config){
  1. for(i in config){
  1. this.option[i] = config[i];
  1. }
  1. }
  1. else{
  1. alert('参数错误!');
  1. return;
  1. }
  1. this.status = 0; //加载器的状态,0:未启动   1:正在加载   2:加载完毕
  1. this.total = this.option.resources.length || 0; //资源总数
  1. this.currentIndex = 0; //当前正在加载的资源索引
  1. };
 
  1. resLoader.prototype.start = function(){
  1. this.status = 1;
  1. var _this = this;
  1. var baseUrl = this.option.baseUrl;
  1. for(var i=0,l=this.option.resources.length; i<l; i++){
  1. var r = this.option.resources[i], url = '';
  1. if(r.indexOf('http://')===0 || r.indexOf('https://')===0){
  1. url = r;
  1. }
  1. else{
  1. url = baseUrl + r;
  1. }
 
  1. var image = new Image();
  1. image.onload = function(){_this.loaded();};
  1. image.onerror = function(){_this.loaded();};
  1. image.src = url;
  1. }
  1. if(isFunc(this.option.onStart)){
  1. this.option.onStart(this.total);
  1. }
  1. };
  1. resLoader.prototype.loaded = function(){
  1. if(isFunc(this.option.onProgress)){
  1. this.option.onProgress(++this.currentIndex, this.total);
  1. }
  1. //加载完毕
  1. if(this.currentIndex===this.total){
  1. if(isFunc(this.option.onComplete)){
  1. this.option.onComplete(this.total);
  1. }
  1. }
  1. };
  1. var loader = new resLoader({
  1. resources : [
  1. ],
  1. onStart : function(total){
  1. self.$loadingId.innerText='0%';
  1. self.$loadingIcon.style.left = '0%';
  1. self.$loadingCon.style.width = '0%';
  1. },
  1. onProgress : function(current, total){
  1. var percent =Math.floor(current/total*100);
  1. self.$loadingId.innerText=percent + '%';
  1. self.$loadingIcon.style.left = percent + '%';
  1. self.$loadingCon.style.width = percent + '%';
  1. },
  1. onComplete : function(total){
  1. self.$loadingId.innerText='100%';
  1. self.$loadingIcon.style.left = '100%';
  1. self.$loadingCon.style.width = '100%';
  1. document.getElementById('page_loading').style.display = 'none';
  1. }
  1. });
  1. loader.start();
一枚不会写文章的程序员~

动态加载/删除css文件以及图片预加载的更多相关文章

  1. webpack模块加载css文件及图片地址

    webpack支持css文件加载并打包,只需安装相应加载器并在配置文件中配置 . 加载的css文件内容会与该模块里的js内容混合封装,这样做的好处是一个js文件包含了所有的css与js内容,有效减少了 ...

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

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

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

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

  4. 利用CSS、JavaScript及Ajax实现图片预加载的三大方法

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  5. 利用CSS、JavaScript及Ajax实现图片预加载的三大方法(转)

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  6. Javascript图片预加载详解 分类: JavaScript HTML+CSS 2015-05-29 11:01 768人阅读 评论(0) 收藏

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  7. 图片预加载 js css预加载

    图片预加载, 效果非常明显, 特别是有多个图, 方法很简单 , 体验提升了不少 <div class="hidden">        <script type= ...

  8. 利用CSS、JavaScript及Ajax实现图片预加载的三大方法及优缺点分析

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  9. javascript异步延时加载及判断是否已加载js/css文件

    <html> <head> <script type="text/javascript"> /**======================= ...

随机推荐

  1. Cleaning Shifts POJ - 2376 (贪心题)

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 31194   Accepted: 7677 ...

  2. Asp.net HttpWebRequest和HttpWebResponse发送和接受任何类型数据

    发送字符串数据发送数据 string strId = "guest"; "; string postData = "userid=" + strId; ...

  3. 使用css Flexbox实现垂直居中

    CSS布局对我们来说一直是个噩梦,我们都认为flexbox是我们的救世主.是否真的如我们说说,还有待观察,但是flexbox确非常轻松的解决css长久一来比较难解决的居中问题.让我们来看看到底有多容易 ...

  4. 在O(1)时间内删除链表结点 【微软面试100题 第六十题】

    题目要求: 给定链表的头指针和一个结点指针,在O(1)时间删除该结点. 参考资料:剑指offer第13题. 题目分析: 有几种情况: 1.删除的结点是头结点,且链表不止一个结点: 2.删除的结点是头结 ...

  5. ogre3D学习基础8 --- 资源管理器

    资源管理 可管理的资源有: 材质资源:在.material文件中包含的材质脚本定义(技术.通路.纹理单元等数据的定义). 模型资源:经过优化的二进制网格模型文件,扩展名为.mesh.包含几何信息和一些 ...

  6. 命令行客户端操作pg数据库常用操作

    登录 # su - postgres -c "psql" 或者 $psql -U user_name -d database_name -h serverhost psql (10 ...

  7. 运行Android程序出错:The connection to adb is down, and a severe error has occured

    调试Android程序时候,报错如下: [2013-02-21 15:41:06 - MainActivity] ------------------------------[2013-02-21 1 ...

  8. 九度oj 题目1494:Dota

    题目描述: 大家都知道在dota游戏中,装备是对于英雄来说十分重要的要素. 英雄们不仅可以购买单个的装备,甚至某些特定的装备组合能够合成更强的装备. 为了简化问题,我们将每个装备对于英雄的功能抽象为一 ...

  9. DS博客作业-05--树

    1.本周学习总结  1.1思维导图  1.2学习体会 1.课堂上的知识也很难听懂,打代码就更难听懂了,真的需要不断练习代码. 2.在学习本章的内容中,一开始只是理解了概念,在真正做题中,一点思路都没有 ...

  10. 【Luogu】P4358密钥破解(Pollard Rho)

    题目链接 容易发现如果我们求出p和q这题就差不多快变成一个sb题了. 于是我们就用Pollard Rho算法进行大数分解. 至于这个算法的原理,emmm 其实也不是很清楚啦 #include<c ...