ここでどこが間違っているのかわかりません:/。このコードを実行すると、空白の要素だけが表示されます。 insertRuleメソッドに何も実行させられないようです(エラーも発生しません)。私は何かが足りないのですか?
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
</head>
<body>
<script>
var sheet = (function() {
// Create the <style> tag
var style = document.createElement("style");
// WebKit hack
style.appendChild(document.createTextNode(""));
// Add the <style> element to the page
document.head.appendChild(style);
return style.sheet;
})();
sheet.insertRule("\
#gridContainer {\
width: 100%;\
height: 100%;\
}\
", 0);
</script>
</body>
</html>
少し紛らわしいですが、コードは実際に機能します。返されたXMLツリーに挿入されたルールが表示されないだけです。
コードが機能することを確認するには、次の2つのテストを実行できます。
var style = (function() {
// Create the <style> tag
var style = document.createElement("style");
// WebKit hack
style.appendChild(document.createTextNode(""));
// Add the <style> element to the page
document.head.appendChild(style);
console.log(style.sheet.cssRules); // length is 0, and no rules
return style;
})();
style.sheet.insertRule('.foo{color:red;}', 0);
console.log(style.sheet.cssRules); // length is 1, rule added
<p class="foo">
I am some text
</p>
上記のスニペットを実行すると、CSSルールが適用されていることがわかります。また、コンソールではcssRules
プロパティも変更されます。
これは、ブラウザー拡張機能がDOMに追加されたカスタムスタイルシートを生成するときによく見られ、デバッグ中はインスペクターに空のスタイルシートとして表示されます。
このバージョンは、Awalの回答と web archive のJavascriptを使用したTotally PwnCSSに基づいています。 idパラメーターは、getElementByIdを使用してstyleSheetにアクセスする場合に役立ち、mediaパラメータは最適であり、「画面」にデフォルト設定されています。 styleSheet.sheetを返します。これは私の好みです。
function createStyleSheet (id, media) {
var el = document.createElement('style');
// WebKit hack
el.appendChild(document.createTextNode(''));
el.type = 'text/css';
el.rel = 'stylesheet';
el.media = media || 'screen';
el.id = id;
document.head.appendChild(el);
return el.sheet;
}