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 YUI 读码日记之 YAHOO.util.Dom - Part.3
Mar 22 Javascript
JQuery UI皮肤定制
Jul 27 Javascript
60个很实用的jQuery代码开发技巧收集
Dec 15 Javascript
javascript中定义类的方法详解
Feb 10 Javascript
JavaScript的事件代理和委托实例分析
Mar 25 Javascript
javascript创建函数的20种方式汇总
Jun 23 Javascript
Bootstrap 网站实例之单页营销网站
Oct 20 Javascript
JSON 必知必会 观后记
Oct 27 Javascript
JavaScript基础之流程控制语句的用法
Aug 31 Javascript
vue-cli2.9.3 详细教程
Apr 23 Javascript
关于微信小程序登录的那些事
Jan 08 Javascript
基于javascript实现贪吃蛇经典小游戏
Apr 10 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代码(抓取网页中的邮箱地址)
2012/07/17 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
关于PHP定时发送服务的解决办法
2017/04/23 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
鼠标图片振动代码
2006/07/06 Javascript
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
javascript tips提示框组件实现代码
2010/11/19 Javascript
jqeury eval将字符串转换json的方法
2011/01/20 Javascript
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
兼容浏览器的js事件绑定函数(详解)
2017/05/09 Javascript
移动端触摸滑动插件swiper使用方法详解
2017/08/11 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
nodejs实现套接字服务功能详解
2018/06/21 NodeJs
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
vue 中几种传值方法(3种)
2019/11/12 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
2020/12/29 Javascript
简单学习Python多进程Multiprocessing
2017/08/29 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
2019/06/27 Python
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
音乐学院硕士生的自我评价分享
2013/11/01 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
上课玩手机检讨书
2014/02/08 职场文书
化工专业求职信
2014/07/01 职场文书
财产分割协议书范本
2014/11/03 职场文书
2014年加油站工作总结
2014/12/04 职场文书
运动会闭幕词
2015/01/28 职场文书
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers