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 相关文章推荐
extjs DataReader、JsonReader、XmlReader的构造方法
Nov 07 Javascript
jQuery 学习第五课 Ajax 使用说明
May 17 Javascript
aspx中利用js实现确认删除代码
Jul 22 Javascript
后台获取ZTREE选中节点的方法
Feb 12 Javascript
jQuery事件绑定on()与弹窗实现代码
Apr 28 Javascript
Angularjs 创建可复用组件实例代码
Oct 09 Javascript
原生JS实现图片翻书效果
Feb 16 Javascript
ES6正则的扩展实例详解
Apr 25 Javascript
使用Angular-CLI构建NPM包的方法
Sep 07 Javascript
JS实现打字游戏
Dec 17 Javascript
原生js实现文件上传、下载、封装等实例方法
Jan 05 Javascript
原生js实现自定义滚动条
Jan 20 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
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
PHP实现数组和对象的相互转换操作示例
2019/03/20 PHP
YII框架关联查询操作示例
2019/04/29 PHP
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
JavaScript QueryString解析类代码
2010/01/17 Javascript
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
我的NodeJs学习小结(一)
2014/07/06 NodeJs
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
JS中跳出循环的示例代码
2017/09/14 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
轻松学习JavaScript函数中的 Rest 参数
2019/05/30 Javascript
使用Layui搭建后台管理界面的操作方法
2019/09/20 Javascript
用Python删除本地目录下某一时间点之前创建的所有文件的实例
2017/12/14 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
2018/05/04 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
Html5页面二次分享的实现
2018/07/30 HTML / CSS
英国足球店:UK Soccer Shop
2017/11/19 全球购物
机电一体化自荐信
2013/12/10 职场文书
益达广告词
2014/03/14 职场文书
影视广告专业求职信
2014/09/02 职场文书
教师见习总结范文
2015/06/23 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书