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 相关文章推荐
JS 学习笔记 防止发生命名冲突
Jul 30 Javascript
Lua表达式和控制结构学习笔记
Dec 15 Javascript
学习javascript面向对象 掌握创建对象的9种方式
Jan 04 Javascript
微信小程序 SocketIO 实例讲解
Oct 13 Javascript
jQuery grep()方法详解及实例代码
Oct 30 Javascript
JS一个简单的注册页面实例
Sep 05 Javascript
vue如何进行动画的封装
Sep 26 Javascript
vue实现一个炫酷的日历组件
Oct 08 Javascript
jQuery属性选择器用法实例分析
Jun 28 jQuery
jquery实现手风琴案例
May 04 jQuery
JS出现404错误原理及解决方案
Jul 01 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
Jul 27 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制作图型计数器的例子
2006/10/09 PHP
openPNE常用方法分享
2011/11/29 PHP
php curl基本操作详解
2013/07/23 PHP
php读取mysql中文数据出现乱码的解决方法
2013/08/16 PHP
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
php使用curl简单抓取远程url的方法
2015/03/13 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
PHP7 字符串处理机制修改
2021/03/09 PHP
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
JavaScript对HTML DOM使用EventListener进行操作
2015/10/21 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
js实现登录框鼠标拖拽效果
2017/03/09 Javascript
Vue 换肤的示例实践
2018/01/23 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
2015/05/22 Python
python方法生成txt标签文件的实例代码
2018/05/10 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
python实现共轭梯度法
2019/07/03 Python
Django logging配置及使用详解
2019/07/23 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
销售员求职个人的自我评价
2014/02/19 职场文书
绿色小区申报材料
2014/08/22 职场文书
联谊活动总结
2014/08/28 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
Python音乐爬虫完美绕过反爬
2021/08/30 Python
详解 TypeScript 枚举类型
2021/11/02 Javascript
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技
ubuntu端向日葵键盘输入卡顿问题及解决
2022/12/24 Servers