cssRules在不同瀏覽器中的兼容性


在一份HTML文檔中可以用三種方式添加樣式信息:

1、通過<link>元素引用外部樣式表;

2、通過<style>元素在文檔的頭部添加樣式信息;

3、在具體的文檔元素上通過style特性指定樣式信息。

對於第三種樣式信息可以在DOM中通過元素節點的style屬性進行操作。

對於前兩種樣式信息在DOM中要通過CSSStyleSheet對象的屬性和方法進行操作。

CSSStyleSheet對象有一個官方文檔規定的cssRules屬性,表示樣式表中(上述前兩種樣式表)的樣式規則的集合(每一條樣式規則包含CSS選擇器、大括號和括號中的鍵值對)。

還有一個不是官方規定的rules屬性,是較早版本的IE瀏覽器中實現cssRules屬性的專有屬性(至少IE11是支持cssRules屬性的)。

下面看例子。

例1 通過<link>元素引用外部樣式表的情況

HTML文檔的代碼:

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5 <title>操作樣式表</title>
 6 <link rel="stylesheet" type="text/css" href="theme.css" />
 7 <style type="text/css">
 8 #ul1{
 9   height: 3em;
10   background-color: pink;
11 }
12 </style>
13 </head>
14 <body>
15 <p id="p1">onq two</p>
16 <h1>操作樣式表</h1>
17 <ul id="ul1">
18    <li>one</li>
19    <li>two</li>
20 </ul>
21 <input type="button" value="replace" onclick="test();" id="replace" />
22 <input type="button" value="clone" onclick="clon();" />
23 <input type="button" value="remove" onclick="remove();" />
24 <input type="button" value="recovery" onclick="recovery();" />
25 <script type="text/javascript">
26 function test() {
27    //第一種取得外部樣式表的方法
28    var link1 = document.styleSheets[0];
29    
30    //第二種取得外部樣式表的方法
31    var a = document.getElementsByTagName("link")[0];
32    var link2 = a.sheet || a.styleSheet;
33    //兩種方法結果的對比
34    alert(link1==link2);//true
35    
36    //取得外部樣式表中的CSS代碼
37    var rules = link1.cssRules || link1.rules;
38    
39    //試圖輸出全部的樣式規則
40    alert(rules.cssText);//undefined
41    
42    //取得外部樣式表中的第一條樣式規則
43    var rule = rules[0];
44    //輸出第一條樣式規則
45    alert(rule.cssText);
46    
47 }  
48 //將test()函數綁定到replace按鈕的onclick事件上 
49 </script>
50 </body>
51 </html>

外部樣式表的代碼(文件名為theme.css):

 1 #p1{
 2     background-color: #20B2AA;
 3     color: #FAF0E6;
 4     font-weight: bold;
 5     font-size: 2em;
 6     font-family: "Times New Roman",Georgia,Serif;
 7 }
 8 
 9 h1{
10     font-family: "Times New Roman",Georgia,Serif;
11     background-color: #3CB371;
12 }

在IE11中的運行情況:

在Firefox中的運行情況:

在chrome中HTML文檔的第40行代碼報錯: Uncaught TypeError: Cannot read property 'cssText' of null.

如果將第40行代碼(test()函數中的alert(rules.cssText);//undefined)注釋掉,再在chrome中運行,在Developer Tools中顯示如下信息:

cssRules屬性和rules屬性的值均為null。

通過例1可知,對於<link>元素引用外部樣式表,chrome不能通過cssRules屬性和rules屬性獲取其中的CSS規則,而Firefox和IE可以。

那么對於<style>元素添加的樣式信息會怎樣呢?看下面的例子。

例2 通過<style>元素在文檔的頭部添加樣式信息的情況

例2的代碼其實與例1的代碼幾乎一樣,只要更改其中的幾個字符就行了:

把HTML文檔中第28行代碼中方括號里的數字0改為1;

把第31行代碼中的link字符串改為style字符串;

改完之后再分別在chrome、Firefox和IE瀏覽器中運行就會看到代碼在三種瀏覽器中都能正常運行,而且輸出結果一樣。

 

總結

通過上面兩個例子可以知道對於<link>元素引用的外聯樣式表,chrome不知持通過cssRules屬性獲得其中的樣式規則,而Firefox和IE可以。對於通過<style>元素添加的樣式信息,三種瀏覽器都可以通過cssRules屬性獲得其中的樣式規則。

PS.不但可以通過cssRules屬性獲得樣式規則,還可以通過CSSStyleSheet對象的style屬性(不是元素節點的style屬性)修改具體的某一條規則,但這種修改會反映到所有與該條規則關聯的HTML元素的樣式,具體見《Javascript高級程序設計(第三版)》319頁。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM