我有一些代码(实际上不是我的,而是SlickGrid库)创建一个<style>
元素,将其插入 DOM,然后立即尝试在 document.styleSheets 集合中查找新样式表。
在 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 对象可用吗?它是一个错误吗? - 如果没有,我可以使用其他条件还是只需要使用超时来执行此操作?
- 还是我绑定加载事件的方式有问题,这是我的问题?