要素を作成してDOMに挿入し、すぐにdocument.styleSheetsコレクションで新しいスタイルシートを見つけようとするコード(実際には私のものではありませんが、SlickGridライブラリ)があります。<style>
WebKit では、これが失敗することがあります。実際にどのような状況なのかはわかりませんが、一貫して再現できるものではありません。load
次のように、スタイル要素のイベントが発生するまで StyleSheet オブジェクトのチェックが行われないように、コードを変更することで回避できると考えました。
$style = $("<style type='text/css' rel='stylesheet' />").appendTo($("head"));
var rules = ...;// code to create the text of the rules here
if ($style[0].styleSheet) { // IE
$style[0].styleSheet.cssText = rules.join(" ");
} else {
$style[0].appendChild(document.createTextNode(rules.join(" ")));
}
$style.bind('load', function() {
functionThatExpectsTheStylesheet();
});
functionThatExpectsTheStylesheet は、次のように実際のスタイルシート オブジェクトを見つけようとします。
var sheets = document.styleSheets;
for (var i = 0; i < sheets.length; i++) {
if ((sheets[i].ownerNode || sheets[i].owningElement) == $style[0]) {
stylesheet = sheets[i];
break;
}
}
しかし、その時点でも、スタイルシート オブジェクトが見つからないことがあります。
だから、私の質問はこれです:
- 実際、この
load
イベントは styleSheet オブジェクトが利用可能であることを保証していませんか? バグですか? - そうでない場合、使用できる別の条件はありますか、それともタイムアウトを使用してこれを行う必要がありますか?
- または、load イベントをバインドする方法に問題があり、それが私の問題ですか?