2011-11-21 4 views
17

document.styleSheetsは、ページ内のすべての有効なスタイルシートで構成されています。私は新しいものを作成し、それをjavascriptを使って現在のリストに追加できるかどうかを知りたい。Javascript:CSSStyleSheetオブジェクトを動的に作成して挿入できますか?

私は私がChromeから得るものすべてがTypeError: Illegal constructorで、document.styleSheets[0].constructordocument.styleSheets[0].__proto__.constructornew CSSStyleSheetCSSStyleSheet()を試してみました。 CSSStyleSheet.constructor()は純粋なオブジェクトを返しましたが、CSSStyleSheetオブジェクトが必要です。

リンク/スタイル要素を作成して追加してから変更することができます。私が知りたいことは、そういうオブジェクトをjavascriptで直接作ることができるのですか?あなたはjavascriptの内部のCSSを記述しようとしている場合

+0

HTTP経由で検索するよりもはるかに簡単: //stackoverflow.com/questions/574944/how-to-load-up-css-files-using-javascript –

+1

新しい 'style'要素を作成して追加するだけです。新しい「CSSStyleSheet」が作成されます。 – Shea

答えて

2

あなたが求めているものに近づく唯一のアプローチは、IE専用document.createStyleSheet([url] [,index])メソッドです。これは、最大31個まで作成することができます。*styleSheetオブジェクト(その後、手動でstyle要素を手動で作成し、documentに追加する必要があります)。

This answerあなたはIE以外のブラウザ用createStyleSheet()方法を定義する方法を示していますが、それは(何らかの理由であなたが避けるためにしようとしている)link/style要素を追加することによって、そう期待通り。 *


IE 6 9から31のインポートスタイルシートdue to 5-bit field used for storing sheet IDsに制限されます。 IE10ではこの制限は、4095

+5

_ *点滅* _。 IEはまだ私に印象づけ続けています。 –

5

、次の操作を行います。

var s = document.createElement('style'); 
s.type = 'text/css'; 
s.innterText = 'body { background: #222; } /*... more css ..*/'; 
document.head.appendChild(s); 

サーバーからスタイルシートをロードしようとしている場合一方:限り

var s = document.createElement('link'); 
s.type = 'text/css'; 
s.rel = 'stylesheet'; 
s.href = '/url/to/css/file.css'; 
document.head.appendChild(s); 
+0

申し訳ありませんが、私はこの方法を知っていると言いました。私はjavascriptでこのオブジェクトを直接作成できるかどうかは不思議です。 – ayanamist

+0

uuhhhh ....これはjavascriptです。あなたはどういう意味ですか? – regality

+3

'innerText'を使用しないでください。これは標準の一部ではなく、完全なブラウザ互換性はありません。完全な互換性のために 's.appendChild(document.createTextNode(styles))'を使用してください。 –

2

に上げてきたあなたはこれを試してみました:

var myCSSStyleSheetIbj = Object.create(document.styleSheets[0]) 

[0]あなたがdocument.styleSheetsを交換する場合document.styleSheets [0]は実際にCSSStyleSheetオブジェクト、 であると仮定すると、どんなCSSStyleSheetでも動作します。

+0

* empty *オブジェクトを作成するには、むしろ 'Object.create(Object.getPrototypeOf(document.styleSheets [0]))'をここで使いたいかもしれませんが、オブジェクトを追加することは許されないようです。 –

+0

素晴らしいですが、一度作成すれば、ドキュメントにどのように挿入すればよいですか? –

1

はい、できます。 document.styleSheetsを直接変更することはできませんが、ドキュメントに新しいスタイルのタグを追加することにより、エントリを追加することができます。

// Create the style element 
var elem = $('<style id="lwuiStyle"></style>'); 
$('head').append(elem); 

// Find its CSSStyleSheet entry in document.styleSheets 
var sheet, 
    yourSheet = null; 
for (var sid in document.styleSheets) { 
    if (document.styleSheets.hasOwnProperty(sid)) { 
     sheet = document.styleSheets[sid]; 
     if (sheet.ownerNode == elem[0]) { 
      yourSheet = sheet; 
      break; 
     } 
    } 
} 

// Test it by changing the background colour 
yourSheet.insertRule('body {background-color: #fa0}', yourSheet.cssRules.length); 

Firefoxを実行する場合は、あなたが直接スクラッチパッドでこれをテストすることができます。コードをコピーして、プレスShift+F4、貼り付けて、Ctrl+Lでコードを実行します。楽しむ!

2

Object.create(CSSStyleSheet.prototype)

あなたにCSSStyleSheetの空のインスタンスをバック与えます。言い換えれば、それはまさにあなたが期待している通りですnew CSSStyleSheet

Object.createは、ECMAScript 5をサポートしているどのブラウザでも利用できます。互換性テーブルhereを検索してください。

+0

おそらくあなたは精巧にすることができますか? 1つの行をむしろ隠すコードの代わりに? – Carpetsmoker

+0

それは質問に対する答えなので、私の目には何のコメントも不要でした。ステートメントはCSSStyleSheetの新しいインスタンスを返します。 – daluege

+0

偉大な、今私は新しいオブジェクトを持って、どのように私の文書に挿入するのですか? –

9

あなたは要素を作成したくないと言ったことは知っていますが、それは真に唯一の方法です。少数の人々は、上記のこのアプローチを詳しく説明しているが、私は誰もがHTMLStyleElementHTMLLinkElementの両方が彼らのCSSStyleSheetへの直接アクセスを取得するためにきちんとsheet propertyを持っていることをオフにカバーされていない注意してください:

var style = document.createElement("style"); 
document.head.appendChild(style); // must append before you can access sheet property 
var sheet = style.sheet; 

console.log(sheet instanceof CSSStyleSheet); 

document.styleSheets

関連する問題