这篇文章主要介绍了IE8中使用javascript动态加载CSS的解决方法,此方法也不是很完美,需要的朋友参考下吧

众所周知做前端开发的都恨不得踹IE开发者几脚,IE开发者名声之差不低于GFW开发者,昧着良心搞坏市场,人人得而诛之,但是在中国这些地方市场占有率摆在那里,没办法只能向现实低头。

最近我们产品需要在浏览器里动态载入一段CSS,以前的代码是直接用的:


var bubbleCss = document.createElement('style');
bubbleCss.type = 'text/css';
bubbleCss.innerHTML = blc_conf.bubbleStyle;
document.getElementsByTagName('head')[0].appendChild(bubbleCss);

不过这个只有IE9支持,在IE8下会出问题,一直也没注意到这块,直到最近重构后做完整测试的时候才发现。
网上搜到一个,试过,可行,但是有一些问题

window.bc_bubble_css = blc_conf.bubbleStyle;
document.createStyleSheet("javascript:bc_bubble_css");

这里可以创建由变量bc_bubble_css定义的样式,不过由于HTML5逐渐普及,我们的css里也混入了一些css3 selector,使用这个方导致IE8的parser解析到css3 selector的时候抛异常并停止解析后续css,这让css只加载了一半,网上搜到的办法都是用StyleSheet类型的addRule来增加,不过这个需要自己指定css2 selector以及样式,
因此需要从CSS中拆开单个的规则,然后依次调用addRule,例子:

var s = document.createStyleSheet();
var rules = blc_conf.bubbleStyle.replace(//*[^*]**//g, "").replace(/@[^{]*{/g, '').match(/[^{}]+{[^}]+}/g);
for(var i = 0; i < rules.length; i++) {
  var m = rules[i].match(/(.*)s*{s*(.*)}/);
  if(m) {
  try {
  s.addRule(m[1], m[2]);
  } catch(e) {
  }
  }
}

开头有两个替换,分别去掉注视和部分css3 的selector,不过依然有漏网的selector,需要在后面try catch 捉一下。

另外再次鄙视设计IE接口的人

最新资讯
传捷信将员工输送到美团送外卖、还得穿工装 回应:消息不实

传捷信将员工输送到美

近日,有网友爆料称,由于受到疫情及监管影响,捷信消费有限
腾讯QQ上线青少年模式 减少对学习干扰降低社交风险

腾讯QQ上线青少年模式

QQ新版本近期上线,QQ青少年模式在原有的学习模式基础上
因公司未履行指定义务 乐视网原董事长刘淑青被限制高消费

因公司未履行指定义务

天眼查App显示,近日,乐视网信息技术(北京)股份有限公司原
58同城宣布完成与Quantum Bloom的私有化合并

58同城宣布完成与Quan

市场消息称,58同城宣布完成与Quantum Bloom的私有化合
京东健康计划本月在港IPO 刘强东变身IPO收割机

京东健康计划本月在港

9月18日消息,京东旗下超级独角兽——京东健康计划最早
特斯拉已在60个Electrify America充电站

特斯拉已在60个Electr

据国外媒体报道,电动汽车制造商特斯拉已在约60个Electr
最新文章
详解Vue的ref特性的使用

详解Vue的ref特性的使

这篇文章主要介绍了详解Vue的ref特性的使用,文中通过
vue学习笔记之slot插槽基本用法实例分析

vue学习笔记之slot插

这篇文章主要介绍了vue学习笔记之slot插槽基本用法,结
vue跳转方式(打开新页面)及传参操作示例

vue跳转方式(打开新页

这篇文章主要介绍了vue跳转方式(打开新页面)及传参操作,
vue学习笔记之过滤器的基本使用方法实例分析

vue学习笔记之过滤器

这篇文章主要介绍了vue学习笔记之过滤器的基本使用方
js获取本日、本周、本月的时间代码

js获取本日、本周、本

本篇文章给大家分享的内容是利用js如何获取本日、本周
node crawler如何添加promise支持

node crawler如何添加

这篇文章主要介绍了node crawler如何添加promise支持,