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用户注册提示效果的简单实例
Aug 17 Javascript
js进行表单验证实例分析
Feb 10 Javascript
原生JavaScript编写俄罗斯方块
Mar 30 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
Apr 05 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
Nov 19 Javascript
javascript产生随机数方法汇总
Jan 25 Javascript
详解Node.Js如何处理post数据
Sep 19 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
Nov 29 Javascript
浅谈Vue.js
Mar 02 Javascript
微信小程序使用modal组件弹出对话框功能示例
Nov 29 Javascript
详解Vue 事件修饰符capture 的使用
Dec 29 Javascript
js实现双人五子棋小游戏
May 28 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
一个目录遍历函数
2006/10/09 PHP
php验证手机号码
2015/11/11 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
精心挑选的15款优秀jQuery 本特效插件和教程
2012/08/06 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
2017/04/18 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
vuex 使用文档小结篇
2018/01/11 Javascript
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
2018/01/21 jQuery
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
2020/04/23 Javascript
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
Pycharm设置去除显示的波浪线方法
2018/10/28 Python
Flask配置Cors跨域的实现
2019/07/12 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
python中JWT用户认证的实现
2020/05/18 Python
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
基于CSS3实现立方体自转效果
2016/03/01 HTML / CSS
技校生自我鉴定
2013/12/08 职场文书
护理专业学生的求职信范文
2013/12/11 职场文书
大学旷课检讨书
2014/01/28 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
毕业实习单位意见
2015/06/04 职场文书
如何判断pytorch是否支持GPU加速
2021/06/01 Python