看起來你已經完成了對這個井的研究。通過訪問CSSStyleDeclaration
或CSSRuleList
對象是不可能的,因爲未識別的屬性會被濾除,這是大多數主流瀏覽器中的一個實現錯誤,因爲它們應該列出所有屬性 - 即使它們不理解。有關詳情,請參閱related question。
其餘的替代方法與@Sarfaraz已經提到的一樣需要太多的工作。這一切都歸結爲手工解析所有內容,並重新執行瀏覽器爲我們完成的工作。假設你的樣式聲明是內聯的,或者在<style>
標籤中,或者作爲元素的樣式屬性,那麼你將不得不分析文本並構建一個所有有趣的CSS3屬性的地圖。隨着直列屬性,它基本上解析文本有點類似:
`prop1: value; prop2: value2; ..`
見@Nick Craver的回答類似question,他已經掛了這樣一個正則表達式的方法。
隨着聯標籤,文本解析會的形式爲:
[selector] {
prop1: value1;
prop2: value2;
...
}
...
這是一個過於簡單化忽略所有的語法產生式規則,並且有問題的負荷在這裏處理。
如果樣式表外,並在頁面內引用,那麼你就必須查找具有屬性rel
等於"stylesheet"
的<link>
元素,並得到他們的href
財產。另外,解析導入的樣式表的url。一旦你有這些url,你可以進行AJAX調用來獲取這些樣式表的實際內容,假設沒有阻塞服務器端的調用。一旦你從每個文件中獲得文本,它基本上是一個與上面相同的解析步驟,並根據瀏覽器使用insertRule
或addRule
添加必要的規則。
可能有開源的CSS解析器,可以幫助你做到這一點。
這可能是說,我覺得@ jrista的解決方案是一個相當不錯的很長的路要走。如果您不想編寫供應商特定代碼的所有排列,那麼更簡單和更好的方法是創建一個CSS生成層,這是生成所有排列並吐出CSS文件的生成過程的一部分。
該層還可以通過檢查User-Agent
頭包含優化和僅產生所需的樣式,這是GWT確實基本上什麼(但它預先生成的,而不是在運行時做這一切可能的排列)。
這可能是一件嚴肅的事,所以在這一天結束時,你必須評估你的選擇,看看是否達到碼純度勝過有一個小的冗餘帶來的好處的努力。
這是一項艱鉅的任務之間的語法差異的細節你的大腦!你會處理很多東西! – Sarfraz 2010-06-13 06:58:22
它看起來像是:) – Monokai 2010-06-15 12:49:22