Mam pewien kod (to nie jest mój, ale biblioteka SlickGrid), który tworzy element <style>
, wstawia go do DOM, a następnie natychmiast próbuje znaleźć nowy arkusz stylów w kolekcji document.styleSheets.Webkit - dynamicznie tworzony arkusz stylów - kiedy naprawdę się ładuje?
W pakiecie WebKit czasami się to nie udaje. W rzeczywistości nie mam pojęcia, jakie są okoliczności, ale to nic, co jest konsekwentnie powtarzalne. Pomyślałem mogłem obejść poprzez zmianę kodu tak czek dla obiektu StyleSheet nie zdarza się aż przypadku load
na element stylu, tak jak poniżej:
$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();
});
i functionThatExpectsTheStylesheet próbuje zlokalizować rzeczywisty obiekt stylesheet tak:
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;
}
}
, ale czasami nawet w tym miejscu nie znaleziono obiektu arkusza stylów.
Więc moje pytanie brzmi:
- Czy zdarzenie w rzeczywistości
load
nie gwarantuje, że obiekt styleSheet będzie dostępna? Czy to błąd? - Jeśli nie, czy istnieje inny warunek, którego mogę użyć lub czy muszę to zrobić, korzystając z limitów czasu?
- Czy jest jakiś problem ze sposobem wiązania zdarzenia obciążenia i to jest mój problem?
myślę dokonywania Fiddle byłoby pomocne – Brewal
Może być duplikatem http://stackoverflow.com/questions/8060429/when-is-a-stylesheet-added-to-document-stylesheets –
@Brewal Mogę to wypróbować, ale zdarza się to mniej niż 10% czasu w moich prawdziwych przypadkach testowych, więc nie wiem, jak by to było pomocne. – Dan