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 相关文章推荐
学习YUI.Ext 第四天--对话框Dialog的使用
Mar 10 Javascript
JS Array.slice 截取数组的实现方法
Jan 02 Javascript
基于jquery实现轮播焦点图插件
Mar 31 Javascript
JS 实现Base64编码与解码实例详解
Nov 07 Javascript
jQuery实现扑克正反面翻牌效果
Mar 10 Javascript
微信小程序 仿猫眼实现实例代码
Mar 14 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
Mar 15 Javascript
Vue实现一个返回顶部backToTop组件
Jul 25 Javascript
Vue 源码分析之 Observer实现过程
Mar 29 Javascript
jquery+css实现Tab栏切换的代码实例
May 14 jQuery
微信小程序实现左滑动删除效果
Mar 30 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
Aug 05 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批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
php 使用file_get_contents读取大文件的方法
2014/11/13 PHP
yii2简单使用less代替css示例
2017/03/10 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
php curl获取到json对象并转成数组array的方法
2018/05/31 PHP
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
2011/09/27 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
2013/06/24 Javascript
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
python k-近邻算法实例分享
2014/06/11 Python
盘点提高 Python 代码效率的方法
2014/07/03 Python
Python实现Linux下守护进程的编写方法
2014/08/22 Python
python中的多线程实例教程
2014/08/27 Python
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
Python通过DOM和SAX方式解析XML的应用实例分享
2015/11/16 Python
Python Grid使用和布局详解
2018/06/30 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
Python3.8对可迭代解包的改进及用法详解
2019/10/15 Python
详解Python IO编程
2020/07/24 Python
理解Django 中Call Stack机制的小Demo
2020/09/01 Python
凯特王妃父母建立的派对用品网站:Party Pieces
2017/05/28 全球购物
C# .NET面试题
2015/11/28 面试题
离职证明范本(5篇)
2014/09/19 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
2016春季运动会前导词
2015/11/25 职场文书
Python利用FlashText算法实现替换字符串
2022/03/31 Python