Webkit - dynamisch erstelltes Stylesheet - wann lädt es wirklich?

8

Ich habe Code (es ist eigentlich nicht meiner, sondern die SlickGrid -Bibliothek), die ein <style> -Element erzeugt, in das es eingefügt wird Das DOM versucht dann sofort, das neue Stylesheet in der document.styleSheets-Auflistung zu finden.

In WebKit schlägt dies manchmal fehl. Ich habe eigentlich keine Ahnung, was die Umstände sind, aber es ist nichts, das durchweg reproduzierbar ist. Ich dachte mir, ich könnte damit umgehen, indem ich den Code ändere, so dass die Überprüfung für das StyleSheet-Objekt nicht vor dem load -Ereignis für das style-Element erfolgt, wie etwa:

%Vor%

und functionThatExpectsTheStylesheet versucht, das tatsächliche Stylesheet-Objekt wie folgt zu finden:

%Vor%

aber manchmal wird das Stylesheet-Objekt selbst zu diesem Zeitpunkt nicht gefunden.

Also, meine Frage ist das:

  1. Garantiert das load -Ereignis tatsächlich nicht, dass das styleSheet-Objekt verfügbar sein wird? Ist es ein Fehler?
  2. Wenn nicht, gibt es eine andere Bedingung, die ich verwenden kann oder muss ich das nur mit Timeouts machen?
  3. Oder gibt es ein Problem mit der Art und Weise, wie ich das load-Ereignis binde, und das ist mein Problem?
Dan 19.07.2013, 13:42
quelle

4 Antworten

6

Das dynamische Laden von CSS-Stylesheets ist leider immer noch ein Bereich voller Browser-Quirks. In Webkit werden die <style> - und <link> -Elemente sowohl als auch die Ereignisse load und error auslösen beim Laden von Stylesheets. Das load -Ereignis selbst bedeutet jedoch nur, dass die Stylesheet-Ressource geladen wurde, nicht unbedingt, dass sie zu document.styleSheets hinzugefügt wurde.

Der require-css RequireJS Loader beschäftigt sich mit diesem Problem, indem er seinen Lademechanismus basierend auf userAgent sniffing verzweigt (es ist fast nicht möglich, zu erkennen, ob das <link> -Tag das load -Ereignis korrekt auslöst oder nicht. Speziell für Webkit greift die Erkennung auf setTimeout zurück, um das StyleSheet -Objekt zu finden wurde an document.styleSheets

angehängt %Vor%

Während also das Ereignis load auf Webkit ausgelöst wird, ist es unzuverlässig, um auf die entsprechende StyleSheet -Instanz zugreifen zu können. Derzeit ist Firefox 18+ das einzige Modul, das Stylesheet load events korrekt unterstützt.

Offenlegung : Ich bin ein Beitrag zu require-css

Referenzen:

Aintaer 24.07.2013, 16:35
quelle
0
  1. Ich denke, das Load-Event könnte früher ausgelöst werden als das CSS-Stylesheet. Das Problem würde vielleicht 1 von 10 Mal passieren, aber es ist immer noch nicht die beste Praxis und der sauberste Weg.

  2. setTimeout ist sicherlich ein guter Ansatz, da sichergestellt werden kann, dass das Skript zuerst das CSS lädt. Da jedoch nur der Tag des Stylesheets, Mittel, die Verbindung zu ihm erstellt wird, müssen die CSS zuerst heruntergeladen werden, so was auch immer Ansatz dieser beiden Sie es verwenden, ist nie 100% ig garantiert, dass Ihre CSS vor dem Load-Ereignis geladen wird feuert.

100% sicher sein, dass alles in der richtigen Reihenfolge ausgeführt wird, eine synchrone Fileread über AJAX, oder einen asynchronen AJAX-Aufruf mit einer Hilfsfunktion zu machen, die überprüft, ob die CSS bereit sind (diese Weise können Sie den Browser einfrieren nicht aber nach wie vor haben die Möglichkeit zu überprüfen, ob die Datei geladen ist oder nicht). Eine andere Möglichkeit wäre, das Stylesheet-Handbuch zu verlinken: Sie setzen zuerst die Stylesheets und dann den Code in der Kopfzeile Ihrer HTML-Datei.

Ich habe nicht sehen so tief in die Last Ereignisse, aber es könnte sein, dass das DOMContentLoaded Ereignis nur feuert wie CSS geladen wird (Abb Forschung auf diesem)

Sehen Sie hier für similiar Frage: jQuery Ereignis, das nach der CSS-Trigger ist geladen?

    
David Fariña 19.07.2013 13:54
quelle
0

Ich behaupte nicht, eine Lösung zu haben, weder eine Erklärung des Ladezeitpunkts von Webkit, aber ich hatte kürzlich ein ähnliches Problem, aber mit JS: Ich musste absolut sicher sein, dass das jQuery-Framework geladen wurde, bevor ich andere einschließe eigene Bibliotheken, die von jQuery abhängig waren.

Ich habe dann bemerkt, dass das load -Ereignis von jQuery nicht ausgelöst wurde, als ich es erwartet habe.

Was es wert ist, hier, wie ich mein Problem gelöst habe:

%Vor%

Du könntest es versuchen!

    
Bigood 22.07.2013 14:52
quelle
0

Hatte die gleiche Notwendigkeit, die Erkennung für die Stilregel zu verwenden, um zu überprüfen, ob das Stylesheet geladen wurde.

%Vor%     
Alexey Petrushin 29.11.2013 21:07
quelle

Tags und Links