IE8中使用javascript动态加载CSS的解决方法


Posted in Javascript onJune 17, 2014

众所周知做前端开发的都恨不得踹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接口的人

Javascript 相关文章推荐
使用javascript实现ListBox左右全选,单选,多选,全请
Nov 07 Javascript
详解Javascript 装载和执行
Nov 17 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
Aug 06 Javascript
jQuery实现的淡入淡出二级菜单效果代码
Sep 15 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
Oct 25 Javascript
js实现淡入淡出轮播切换功能
Jan 13 Javascript
AngularJS执行流程详解
Feb 17 Javascript
分享十三个最佳JavaScript数据网格库
Apr 07 Javascript
Vue原理剖析 实现双向绑定MVVM
May 03 Javascript
简单实现jQuery弹窗效果
Oct 30 jQuery
TypeScript基础入门教程之三重斜线指令详解
Oct 22 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
Oct 16 Javascript
jQuery循环滚动新闻列表示例代码
Jun 17 #Javascript
页面刷新时记住滚动条的位置jquery代码
Jun 17 #Javascript
javascript 获取HTML DOM父、子、临近节点
Jun 16 #Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
Jun 16 #Javascript
input:checkbox多选框实现单选效果跟radio一样
Jun 16 #Javascript
Jquery动态添加及删除页面节点元素示例代码
Jun 16 #Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
Jun 16 #Javascript
You might like
php+javascript的日历控件
2009/11/19 PHP
PHP Class&amp;Object -- 解析PHP实现二叉树
2013/06/25 PHP
thinkphp验证码的实现(form、ajax实现验证)
2016/07/28 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
node.js平台下的mysql数据库配置及连接
2017/03/31 Javascript
js图片上传的封装代码
2017/08/01 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
Javascript和jquery在selenium的使用过程
2019/10/31 jQuery
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
python备份文件的脚本
2008/08/11 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
ActiveMQ:使用Python访问ActiveMQ的方法
2019/01/30 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
详解Python 4.0 预计推出的新功能
2019/07/26 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
python 字段拆分详解
2019/12/17 Python
Pycharm同步远程服务器调试的方法步骤
2020/11/04 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
国外平面设计第一市场:99designs
2016/10/25 全球购物
美国滑雪和滑雪板商店:Buckman
2018/03/03 全球购物
数学教学随笔感言
2014/02/17 职场文书
企业员工集体活动方案
2014/08/17 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
荆州古城导游词
2015/02/06 职场文书
2015年会计工作总结范文
2015/05/26 职场文书
公务员处分决定书
2015/06/25 职场文书
创业计划书之网络外卖
2019/10/31 职场文书
Java内存模型之happens-before概念详解
2021/06/13 Java/Android