私はJavaScriptのスタイルシートルールを動的に追加しようとしています。例2のようになります。 hereスタイルシートがdocument.styleSheetsに追加されるのはいつですか?
これは、ほとんどの時間の作品が、それは(少なくとも)クロム(15.0.874及び17.0.933)に時々失敗します競合状態があるように思われます。キャッシュが空の場合(またはクリアされた場合)は、まれにしか発生しません。
ここで私はそれを絞り込むことができました。最初に外部スタイルシートを<head>
に追加してロードしてから、新しいスタイルシートを作成します(ここではルールを追加します)。私はdocument.styleSheets
の長さを印刷します(直ちに1秒後)。それはスタイルのいずれかを追加していないという意味
$(function() {
// it doesn't happen if this line is missing.
$("head").append('<link rel="stylesheet" type="text/css"'+
'href="/css/normalize.css" />');
var stylesheet = document.createElement("style");
stylesheet.setAttribute("type", "text/css");
document.getElementsByTagName('head')[0].appendChild(stylesheet);
var b = $('body');
b.append(document.styleSheets.length).append('<br/>');
setTimeout(function() {
b.append(document.styleSheets.length).append('<br/>');
}, 1000);
});
(http://jsfiddle.net/amirshim/gAYzY/13/でそれで遊ぶ)
キャッシュがクリアされている場合、それは時々、その後2
4
を印刷します(jsfiddleは、それ自身の2つのCSSファイルを追加します)、シートはすぐにdocument.styleSheets
になりますが、おそらく外部ファイルが読み込まれるのを待つでしょう。
これは予想されますか?
、(そこにおよび多くの他)Example 2 on MDNですもしそうなら壊れましたか?ライン27以来:
var s = document.styleSheets[document.styleSheets.length - 1];
私が最初に外部CSSファイルをロードしない場合にこれが起こらないことをdocument.styleSheets.length == 0
注意して評価することがあります。
ご希望の最終結果は何ですか?どのような状況下でCSSファイルにルールを '注入'したいのですが、最初にCSSファイルの中に書かなければなりませんか? – Sotkra
私はスタイルシートを動的に追加していますが、$(document).readyが起動した後でなければなりません... –
@Kees:私が与えたコードは '$(document).ready'ですべてを行います。それは '$(function(){...});'がすることです。 – Amir