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 写类方式之二
Jul 05 Javascript
基于node.js的快速开发透明代理
Dec 25 Javascript
javascript中将Object转换为String函数代码 (json str)
Apr 29 Javascript
javascript作用域容易记错的两个地方分析
Jun 22 Javascript
javascript判断非数字的简单例子
Jul 18 Javascript
Javascript中实现trim()函数的两种方法
Feb 04 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
Mar 03 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
Aug 05 Javascript
Bootstrap的class样式小结
Dec 01 Javascript
详解AngularJS ui-sref的简单使用
Apr 24 Javascript
微信小程序WebSocket实现聊天对话功能
Jul 06 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
Jul 04 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
XHProf报告字段含义的解析
2016/05/17 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
js数组常用操作方法小结(增加,删除,合并,分割等)
2016/08/02 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
python的即时标记项目练习笔记
2014/09/18 Python
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
python将文本转换成图片输出的方法
2015/04/28 Python
Python设计实现的计算器功能完整实例
2017/08/18 Python
解决Python3 抓取微信账单信息问题
2019/07/19 Python
Python实现代码统计工具
2019/09/19 Python
雅高酒店中国:Accorhotels.com China
2018/03/26 全球购物
Reformation官网:美国女装品牌
2018/09/14 全球购物
《钱学森》听课反思
2014/03/01 职场文书
党课培训主持词
2014/04/01 职场文书
小学生评语大全
2014/04/18 职场文书
征兵宣传标语
2014/06/20 职场文书
美术教师求职信范文
2015/03/20 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技
Python面试不修改数组找出重复的数字
2022/05/20 Python
Redis Lua脚本实现ip限流示例
2022/07/15 Redis