Я пытаюсь динамически добавить правило CSS CSS, используя javascript, что-то вроде примера 2 здесь.
Он работает большую часть времени, но, похоже, это состояние гонки, которое иногда приводит к поломке (по крайней мере) Chrome (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
сразу... но, вероятно, ожидает загрузки внешнего файла.
Ожидается ли это?
Если да, то Пример 2 в MDN (и многие другие там) сломан? Поскольку строка 27:
var s = document.styleSheets[document.styleSheets.length - 1];
может оцениваться с помощью document.styleSheets.length == 0
Обратите внимание, что это не происходит, когда я не загружаю внешний файл CSS сначала.