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 相关文章推荐
基于jquery的$.ajax async使用
Oct 19 Javascript
jquery 插件学习(六)
Aug 06 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
Mar 28 Javascript
在JavaScript中使用开平方根的sqrt()方法
Jun 15 Javascript
详解JavaScript的Polymer框架中的通知交互
Jul 29 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
Aug 12 Javascript
angular实现form验证实例代码
Jan 17 Javascript
微信小程序微信支付接入开发实例详解
Apr 12 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
Apr 28 jQuery
详解webpack loader和plugin编写
Oct 12 Javascript
通过说明与示例了解js五种设计模式
Jun 17 Javascript
浅析Angular 实现一个repeat指令的方法
Jul 21 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
我常用的几个类
2006/10/09 PHP
BBS(php &amp; mysql)完整版(四)
2006/10/09 PHP
PHP中对缓冲区的控制实现代码
2013/09/29 PHP
php实现读取手机客户端浏览器的类
2015/01/09 PHP
浅谈PHP接收POST数据方式
2015/06/05 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
JavaScript 格式字符串的应用
2010/03/29 Javascript
jQuery 通过事件委派一次绑定多种事件,以减少事件冗余
2010/06/30 Javascript
Javascript读取cookie函数代码
2010/10/16 Javascript
JS表单验证的代码(常用)
2016/04/08 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
高性能的javascript之加载顺序与执行原理篇
2018/01/14 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
python基础教程之序列详解
2014/08/29 Python
Python装饰器decorator用法实例
2014/11/10 Python
Python实现简单多线程任务队列
2016/02/27 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
基于python生成器封装的协程类
2019/03/20 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
jupyter notebook实现显示行号
2020/04/13 Python
毕业生机械建模求职信
2013/10/14 职场文书
董事长岗位职责
2013/11/30 职场文书
男方父母婚礼答谢词
2014/01/25 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
亮剑观后感600字
2015/06/05 职场文书
2016年端午节红领巾广播稿
2015/12/18 职场文书