2017-09-27 1 views
0

Im eine HTML-Anwendung mit der folgenden Struktur zu entwickeln:Warum ist Foundation Global manchmal undefiniert?

<html> 
<head> 
    <!-- other head elements --> 
    <script src="jquery.js?_v=3736f12"></script> 
    <script src="error.js?_v=291bb66"></script> 
</head> 

<body> 
    <!-- other body elements --> 
    <script src="foundation.js?_v=880a16f"></script> 
    <script src="my_lib.js?_v=1c3b21e"></script> 
</body> 
</html> 

Was error.js tut, ist, dass es für window.onerror Ereignis hört und wenn es ausgelöst wird, sendet Fehlermeldung über Ajax an den Server uns Entwickler zu benachrichtigen. Auf diese Weise wissen wir, wenn Benutzer Javascript über etwas beschwert.

my_lib.js ist eine ziemlich große Bibliothek, die eine Menge Aufgaben ausführt und oft auf Foundation Framework und ihre Javascript-Bibliothek baut, die kurz vor my_lib.js in der HTML-Struktur enthalten ist.

Jetzt kann ich zu meiner Frage kommen. In diesen Tagen sind wir immer Fehler ähnlich denen:

  • Typeerror: window.Foundation undefiniert
  • Typeerror: undefined ist kein Objekt
  • Uncaught Typeerror ('window.Foundation.Abide' Auswertung): Kann nicht lesen Eigenschaft ‚Dropdown‘ undefinierter (in Code Foundation.Dropdown)

Diese Fehler kommen in der Regel aus Anwendungen von Fundamenten globalen Foundation innerhalb my_lib.js und von verschiedenen Useragents, häufiger von mobilen Geräten, aber nicht ausschließlich. Das Timing der Fehler erfolgt in der Regel vor dem Ereignis "ready" oder manchmal zwischen den Ereignissen "ready" und "load". Das Verrückte daran ist, dass diese Fehler nicht immer von den gleichen Benutzern kommen (nicht einmal wenn sie zweimal auf der gleichen Seite sind), sie kommen nur manchmal und wir konnten keinen einzigen Fehler reproduzieren.

Ich bin mir ziemlich sicher, dass wir Foundation niemals explizit auf undefiniert setzen und wenn wir das wären, wäre das ein Onload-Problem in jedem Blowser.

Das hat mich gefragt, ob foundation.js immer vor der Auswertung von my_lib.js ausgewertet wird. Aus meiner Lektüre von Posts hier auf SO verstehe ich, dass Tags in der Reihenfolge ausgewertet werden und aufeinander warten (wir verwenden niemals async oder defer).

Nur ein weiterer Hinweis ist, dass ich von den Serverprotokollen bekommen konnte, dass diese Fehler in der Regel auftreten, wenn Benutzer unsere Website nach einiger Zeit der Inaktivität eingeben/neu laden. Zum Beispiel nach dem Anmelden oder bei der Aktualisierung nach langer Inaktivität, während noch angemeldet ist.

Hat jemand eine Idee, warum ist das so?

Vielen Dank.

+0

ich denke, das Plugin gestartet werden, bevor die Bibliothek geladen wird – madalinivascu

+0

besser initiieren alle Plugins, wenn alle Rendering abgeschlossen ist – madalinivascu

+0

Ich würde Ihnen empfehlen Attribut zu geben 'defer' zu den Script-Elemente. Es wird JS beim Parsen von HTML herunterladen (was die Ladegeschwindigkeit der Seite erhöhen kann) und es kann auch garantiert werden, dass Skripte in der Reihenfolge ausgeführt werden, in der sie im Dokument erscheinen. BTW: Warum setzen Sie 'script' nicht am Ende des Dokuments, wie zB foundation oder my_lib? – debute

Antwort

0

Klingt wie eine klassische Race-Bedingung, wenn Ihr Code ausgeführt wird die Bibliothek möglicherweise geladen oder nicht geladen, wenn Sie nicht zurück undefined.

Um dies zu vermeiden, bevor Sie einen Code ausführen, der auf der Bibliothek beruht, stellen Sie sicher, dass zum Beispiel dieses Ereignis ausgelöst wurde.

(document.readyState === 'complete') { 
    // good to go! 
} 
+0

Sie sagen also, dass wenn ich zwei Script-Tags mit verschiedenen js-Dateien habe, es nicht garantiert ist, dass die erste bereit ist, wenn die zweite Ausführung beginnt? – Walkerr47

+0

Streng genommen sollte das nicht passieren Script-Tags werden nacheinander nacheinander geladen, solange Sie ihnen keine asynchronen Tags oder ähnliches geben. Dies ist jedoch nicht sehr zuverlässig, abhängig von der Benutzerverbindung und anderen Faktoren. Du weißt nicht, was genau in deiner Bibliothek passiert. Deshalb ist es sicherer, auf den document.readyState zu warten –

Verwandte Themen