2017-07-25 39 views
1

我試圖在任何加載的頁面中檢測(然後更改)樣式表。document.styleSheets不檢測所有樣式表

我嘗試如下因素代碼:

// from https://developer.mozilla.org/en-US/docs/Web/API/StyleSheetList 
 
var allCSS = 
 
    [].slice.call(document.styleSheets) 
 
     .reduce(function (prev, styleSheet) { 
 
      if (styleSheet.cssRules) { 
 
       return prev + 
 
        [].slice.call(styleSheet.cssRules) 
 
         .reduce(function (prev, cssRule) { 
 
          return prev + cssRule.cssText; 
 
         }, ''); 
 
      } else { 
 
       return prev; 
 
      } 
 
     }, ''); 
 
console.log(allCSS);

當我運行這個頁面例如在這段代碼中,在控制檯中的幾個樣式表。

但是,這是絕對不是所有樣式,它事實上只是它的一小部分。

例如在調試器中,我看到該頁面從'cdn.sstatic.net'加載all.css,其樣式很多,都沒有顯示。

我在做什麼錯?以及如何獲得所有樣式表?

Thx!

+1

在Firefox的控制檯中運行你的代碼導致'SecurityError:操作不安全 - 可能是一個交叉的來源問題? –

+0

絕對是一個跨國來源的問題。 – Kaiido

+0

在鉻中運行良好。問題依然存在 - 我如何獲得加載到頁面中的所有樣式表? – kofifus

回答

4

CssRules

在某些瀏覽器,如果一個樣式表從不同的域加載,
調用cssRules導致引發SecurityError。

  • 用戶代理(默認)樣式表是不可見的document.styleSheets

The CSSStyleSheet Interface (specs)

的cssRules屬性必須遵循以下步驟:

  • 如果原點,清潔標誌未設置,則拋出SecurityError異常。
  • 返回一個只讀的,表示CSS規則的實時CSSRuleList對象。
+3

它實際上[現在在規格](https:/ /drafts.c​​sswg。org/cssom /#the-cssstylesheet-interface)它應該拋出安全錯誤 – Kaiido

+0

謝謝,我在答案中加入了規格^^ – btzr

0

如果要求是獲取和改變.css文件在document加載,你可以要求你在DevTools查看文件,從document刪除所有現有的樣式表,需要調整的迴應文字,附加調整文本.cssdocument<style>元素。