眾所周知做前端開發的都恨不得踹IE開發者幾腳,IE開發者名聲之差不低於GFW開發者,昧著良心搞壞市場,人人得而誅之,但是在中國這些地方市場佔有率擺在那裡,沒辦法只能向現實低頭。
最近我們產品需要在瀏覽器裡動態載入一段CSS,以前的程式碼是直接用的:
var bubbleCss = document.createElement('style');
bubbleCss.type = 'text/css';
bubbleCss.innerHTML = blc_conf.bubbleSty_conf. 🎜>document.getElementsByTagName('head')[0].appendChild(bubbleCss);
不過這個只有IE9支持,在IE8下會出問題,一直也沒注意到這塊,直到最近重構後做完整測試的時候才發現。
網路搜尋一個技巧,試過,可行,但有些問題
window.bc_bubble_css = blc_conf.bubbleStyle;
document.createStyleSheet("javascript:bc_bubble_css");
這裡可以創建變量由變數來定義的結果,我們的css裡也混入了一些css3 selector,使用這個方法會導致IE8的parser解析到css3 selector的時候拋異常並停止解析後續css,這讓css只加載了一半,網上搜到的辦法都是用StyleSheet類型的addRule來增加,不過這個需要自己指定css2 selector以及樣式,
因此需要從CSS中拆開單一的規則,然後依序呼叫addRule,例子:
var s = document.createStyleSheet();
var rules = blc_conf.placebbbleStyle.place( ^*]**//g, "").replace(/@[^{]*{/g, '').match(/[^{}] {[^}] }/g);
for(var i = 0; i var m = rules[i].match(/(.*)s*{s*(.*)}/);
if(m) {
try {
s.addRule(m[1], m[2])); }
}
開頭有兩個替換,分別去掉注視和部分css3 的selector,不過依然有漏網的selector,需要在後面try catch 捉一下。
另外再次鄙視設計IE介面的人