动态加载/删除css文件以及图片预加载

动态加载/删除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();
一枚不会写文章的程序员~
### 回答1: 非常感谢您的提问。不过,我需要先说明一下,作为一名 AI 语言模型,我并不能代表 CSDN、OpenAI 或者任何组织机构或个人,我只是一台能够提供语言输出的工具。 关于您的问题,CSS 文件编码问题可能会导致乱码的情况发生,可以尝试以下几种方法来解决: 1. 确认编码方式:确认 CSS 文件编码方式是否正确。常见的编码方式有 UTF-8、GBK、GB2312 等。可以通过编辑器或者转码工具来查看和修改编码方式。 2. 转码方式:将 CSS 文件的编码方式转换成正确的编码方式。例如,使用 Notepad++ 或者 Sublime Text 等编辑器,选择“转换为 UTF-8(无 BOM)”等选项进行转换。 3. 编辑器设置:在编辑器的设置中,将编码方式设置为正确的编码方式,确保保存时使用正确的编码方式。 希望这些方法能够帮助到您解决问题。如果还有其他问题,欢迎继续提问。 ### 回答2: 解决CSS文件乱码问题可以采用以下几种方法: 1. 在CSS文件的头部添加字符编码声明:可以在CSS文件的开头加入如下代码: ```css @charset "UTF-8"; ``` 这样可以明确指定CSS文件采用UTF-8编码,确保文件正常显示。 2. 检查服务器端配置:在服务器端,检查是否正确设置响应头的Content-type属性为text/css;charset=utf-8。这可以确保CSS文件以正确的编码形式被浏览器解析。 3. 检查HTML文档的字符编码声明:在HTML文档的头部,使用<meta>标签来指定字符编码,确保与CSS文件编码一致。例如: ```html <meta charset="UTF-8"> ``` 4. 使用转义字符:如果在CSS文件中有特殊字符或非ASCII字符,可以使用Unicode转义字符来替代。例如,使用`\u5b57`来表示一个Unicode字符。 5. 使用编码工具将CSS文件转换为正确编码:有时候,CSS文件可能被保存为错误的编码形式,可以使用文本编辑工具或在线编码转换工具将文件转换为正确的编码形式。 最后,记得保存并重新加载CSS文件,并清除浏览器缓存,刷新页面来查看是否解决了CSS文件乱码问题。 ### 回答3: 要解决CSS文件乱码问题,可以采取以下几种方法: 1. 确保CSS文件编码正确:将CSS文件的编码格式设置为UTF-8。可以使用文本编辑器或IDE打开CSS文件,然后另存为UTF-8编码格式。 2. 在HTML文档中正确地引用CSS文件:确保在HTML文档的head部分使用正确的链接标签引用CSS文件。例如:<link rel="stylesheet" href="style.css" type="text/css"> 3. 在CSS文件中使用正确的字符集声明:在样式表的开头使用@charset规则,指定字符集为UTF-8。例如:@charset "UTF-8"; 4. 确保服务器响应头正确设置:在服务器响应头中添加Content-Type标头,并使用正确的字符集。例如:Content-Type: text/css; charset=UTF-8。 5. 检查CSS文件是否包含非法字符:有时在CSS文件中可能会包含非法字符,可以通过删除或替换这些字符来解决乱码问题。 6. 使用CSS处理器:使用CSS处理器(例如Sass、Less等)可以简化CSS编写,同时自动处理编码问题。 7. 使用网页开发工具调试:使用网页开发工具(如Chrome开发者工具)来检查CSS文件的编码以及在加载过程中是否有错误。 请根据具体情况选择适合的方法来解决CSS文件乱码问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值