У меня есть код (это на самом деле не моя, а библиотека SlickGrid), которая создает элемент <style>
, вставляет его в DOM, а затем сразу же пытается найти новую таблицу стилей в коллекции document.styleSheets.Webkit - динамически созданная таблица стилей - когда она действительно загружается?
В WebKit это иногда терпит неудачу. На самом деле я не знаю, каковы обстоятельства, но это ничего не воспроизводится последовательно. Я полагал, что я мог бы работать вокруг него путем изменения кода, поэтому проверка объекта StyleSheet не произойдет, пока load
событие на элемент стиля, например, так:
$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;
}
}
, но иногда даже в этот момент объект stylesheet не найден.
Так, мой вопрос заключается в следующем:
- ли
load
события на самом деле не гарантирует, что объект STYLESHEET будет доступен? Это ошибка? - Если нет, есть ли другое условие, которое я могу использовать или просто мне нужно сделать, используя таймауты?
- Или есть некоторые проблемы с тем, как я привязываю событие загрузки, и это моя проблема?
Я думаю, что делает Fiddle бы полезным – Brewal
Может быть дубликатом http://stackoverflow.com/questions/8060429/when-is-a-stylesheet-added-to-document-stylesheets –
@Brewal Я могу попробовать это, но это случается менее чем в 10% случаев в моих реальных тестах, поэтому я не знаю, насколько это было бы полезно. – Dan