Ответ 1
После некоторых исследований и написания моего ответа я наткнулся на эту ссылку, в котором объясняется все, что вам нужно знать о CSS, когда оно загружается и как вы можете проверьте его.
Приведенная ссылка объясняет это так хорошо, что я добавляю некоторые цитаты из нее для дальнейшего использования.
Если вам интересно, мой ответ будет # 2 и вариантом # 4.
Когда действительно загружена таблица стилей?
...
С учетом этого, посмотрим, что у нас есть.
// my callback function
// which relies on CSS being loaded function
CSSDone() {
alert('zOMG, CSS is done');
};
// load me some stylesheet
var url = "http://tools.w3clubs.com/pagr/1.sleep-1.css",
head = document.getElementsByTagName('head')[0],
link = document.createElement('link');
link.type = "text/css";
link.rel = "stylesheet";
link.href = url;
// MAGIC
// call CSSDone() when CSS arrives
head.appendChild(link);
Опции для магической части, отсортированные от приятного и легкого до смешного
- прослушать link.onload
- слушать link.addEventListener('load')
- слушать link.onreadystatechange
- setTimeout и проверить изменения в файле document.styleSheets
- setTimeout и проверить изменения в стилировании определенного элемента, который вы создаете, но стиль с помощью нового CSS
Пятый вариант слишком сумасшедший и предполагает, что вы контролируете содержимое CSS, поэтому забудьте об этом. Плюс он проверяет текущие стили в тайм-ауте, что означает, что он запустит очередь reflow и может быть потенциально медленным. Чем медленнее набирать CSS, тем больше переплавов. Так что, действительно, забудьте об этом.
Итак, как насчет реализации магии?
// MAGIC
// #1
link.onload = function () {
CSSDone('onload listener');
};
// #2
if (link.addEventListener) {
link.addEventListener('load', function() {
CSSDone("DOM load event");
}, false);
};
// #3
link.onreadystatechange = function() {
var state = link.readyState;
if (state === 'loaded' || state === 'complete') {
link.onreadystatechange = null;
CSSDone("onreadystatechange");
}
};
// #4
var cssnum = document.styleSheets.length;
var ti = setInterval(function() {
if (document.styleSheets.length > cssnum) {
// needs more work when you load a bunch of CSS files quickly
// e.g. loop from cssnum to the new length, looking
// for the document.styleSheets[n].href === url
// ...
// FF changes the length prematurely :(
CSSDone('listening to styleSheets.length change');
clearInterval(ti);
}
}, 10);
// MAGIC ends