Was wäre ein guter Weg, um zu versuchen, die gehostete jQuery bei Google (oder anderen von Google gehosteten Bibliotheken) zu laden, aber meine Kopie von jQuery zu laden, wenn der Google-Versuch fehlschlägt?
Ich sage nicht, dass Google schuppig ist. Es gibt Fälle, in denen die Google-Kopie blockiert ist (anscheinend zum Beispiel im Iran).
Würde ich einen Timer einrichten und nach dem jQuery-Objekt suchen?
Was wäre die Gefahr, dass beide Kopien durchkommen?
Sie suchen nicht wirklich nach Antworten wie "Verwenden Sie einfach Google" oder "Verwenden Sie einfach Ihre eigenen". Ich verstehe diese Argumente. Ich verstehe auch, dass der Nutzer wahrscheinlich die Google-Version zwischengespeichert hat. Ich denke über Fallbacks für die Cloud im Allgemeinen nach.
Bearbeiten: Dieser Teil hinzugefügt ...
Da Google die Verwendung von google.load zum Laden der Ajax-Bibliotheken vorschlägt und nach Abschluss einen Rückruf ausführt, frage ich mich, ob dies der Schlüssel zur Serialisierung dieses Problems ist.
Ich weiß, es klingt ein bisschen verrückt. Ich versuche nur herauszufinden, ob dies zuverlässig möglich ist oder nicht.
Update: jQuery wird jetzt auf dem CDN von Microsoft gehostet.
quelle
Antworten:
Sie können es so erreichen:
Dies sollte in Ihrer Seite sein
<head>
und alle jQuery-fähigen Ereignishandler sollten in der sein<body>
, um Fehler zu vermeiden (obwohl es nicht narrensicher ist!).Ein weiterer Grund, von Google gehostete jQuery nicht zu verwenden, ist, dass in einigen Ländern der Domain-Name von Google verboten ist.
quelle
Der mit Abstand einfachste und sauberste Weg, dies zu tun:
quelle
XHTML 1.0
undHTML 4.01
type="text/javascript"
Teile zu entfernen. Wenn Sie also HTML für ältere Browser schreiben, beachten Sie, dass Sie dies jetzt hinzufügen müssen.type="text/javascript"
war auch in älteren Browsern nicht erforderlich , da alle standardmäßig Javascript verwendeten. Wirklich ältere Browser haben sich daslanguage
Attribut angesehen. Aber selbst dann war Javascript die Standardeinstellung, wenn das Attribut fehlte.<script src="//cdn1.com/jquery.js"></script> <script>window.jQuery || document.write('<script src="//cdn2.com/jquery.js"><\/script>')</script> <script>window.jQuery || document.write('<script src="local/jquery.js"><\/script>')</script>
Das scheint bei mir zu funktionieren:
Die Funktionsweise besteht darin, das
google
Objekt zu verwenden, das durch Aufrufen von http://www.google.com/jsapi auf daswindow
Objekt geladen wird . Wenn dieses Objekt nicht vorhanden ist, gehen wir davon aus, dass der Zugriff auf Google fehlschlägt. In diesem Fall laden wir eine lokale Kopie mitdocument.write
. (In diesem Fall verwende ich meinen eigenen Server. Bitte verwenden Sie Ihren eigenen, um dies zu testen.)Ich teste auch auf das Vorhandensein von
window.google.load
- ich könnte auchtypeof
überprüfen, ob es sich bei den Dingen um Objekte oder Funktionen handelt. Aber ich denke, das macht den Trick.Hier ist nur die Ladelogik, da die Code-Hervorhebung anscheinend fehlschlägt, da ich die gesamte HTML-Seite gepostet habe, die ich getestet habe:
Obwohl ich sagen muss, bin ich mir nicht sicher, ob Sie, wenn dies ein Problem für Ihre Website-Besucher ist, überhaupt mit der Google AJAX Libraries-API herumspielen sollten .
Unterhaltsame Tatsache : Ich habe anfangs versucht, in verschiedenen Versionen einen try..catch-Block dafür zu verwenden, konnte jedoch keine so saubere Kombination finden. Es würde mich interessieren, andere Implementierungen dieser Idee nur als Übung zu sehen.
quelle
Wenn Sie modernizr.js in Ihre Site eingebettet haben, können Sie Ihre Skripte mithilfe der integrierten Datei yepnope.js asynchron laden - unter anderem jQuery (mit Fallback).
Dadurch wird jQuery von der Google-CDN geladen. Anschließend wird geprüft, ob jQuery erfolgreich geladen wurde. Wenn nicht ("nein"), wird die lokale Version geladen. Auch Ihre persönlichen Skripte werden geladen - das "beides" zeigt an, dass der Ladevorgang unabhängig vom Testergebnis eingeleitet wird.
Wenn alle Ladevorgänge abgeschlossen sind, wird eine Funktion ausgeführt, im Fall 'MyApp.init'.
Ich persönlich bevorzuge diese Art des asynchronen Skriptladens. Und da ich mich beim Erstellen einer Site auf die von modernizr bereitgestellten Funktionstests verlasse, habe ich sie trotzdem in die Site eingebettet. Es gibt also eigentlich keinen Overhead.
quelle
yepnope.js
veraltet. siehe stackoverflow.com/questions/33986561/…Hier gibt es einige großartige Lösungen, aber ich möchte in Bezug auf die lokale Datei noch einen Schritt weiter gehen.
In einem Szenario, in dem Google fehlschlägt, sollte eine lokale Quelle geladen werden, aber möglicherweise ist eine physische Datei auf dem Server nicht unbedingt die beste Option. Ich spreche dies an, weil ich derzeit dieselbe Lösung implementiere. Ich möchte jedoch nur auf eine lokale Datei zurückgreifen, die von einer Datenquelle generiert wird.
Meine Gründe dafür sind, dass ich ein wenig darüber nachdenken möchte, was ich von Google lade und was ich auf dem lokalen Server habe. Wenn ich Versionen ändern möchte, möchte ich meine lokale Kopie mit dem synchronisieren, was ich von Google laden möchte. In einer Umgebung mit vielen Entwicklern wäre es meiner Meinung nach am besten, diesen Prozess so zu automatisieren, dass lediglich eine Versionsnummer in einer Konfigurationsdatei geändert werden muss.
Hier ist meine vorgeschlagene Lösung, die theoretisch funktionieren sollte:
Wenn mein Code richtig geschrieben ist, müsste ich theoretisch nur die Versionsnummer in meiner App-Konfiguration ändern, dann Viola! Sie haben eine automatisierte Fallback-Lösung und müssen keine physischen Dateien auf Ihrem Server verwalten.
Was denken alle? Vielleicht ist dies ein Overkill, aber es könnte eine elegante Methode zur Pflege Ihrer AJAX-Bibliotheken sein.
Eichel
quelle
Nachdem Sie versucht haben, Googles Kopie aus dem CDN aufzunehmen.
In HTML5 müssen Sie das
type
Attribut nicht festlegen .Sie können auch ...
quelle
[Violation] Avoid using document.write().
Möglicherweise möchten Sie Ihre lokale Datei als letzten Ausweg verwenden.
Scheint, dass jQuerys eigenes CDN derzeit kein https unterstützt. Wenn ja, möchten Sie möglicherweise zuerst von dort laden.
Hier ist die Reihenfolge: Google CDN => Microsoft CDN => Ihre lokale Kopie.
quelle
Laden Sie die neueste / ältere jQuery-Version und den Fallback unter bestimmten Bedingungen:
quelle
jQuery
)So überprüfen Sie eine nicht definierte Variable in JavaScript
Wie füge ich eine JavaScript-Datei in eine andere JavaScript-Datei ein?
quelle
Aufgrund des Verbotsproblems von Google bevorzuge ich die Verwendung von Microsoft cdn http://www.asp.net/ajaxlibrary/cdn.ashx
quelle
Hier ist eine großartige Erklärung dazu!
Implementiert auch Ladeverzögerungen und Timeouts!
http://happyworm.com/blog/2010/01/28/a-simple-and-robust-cdn-failover-for-jquery-14-in-one-line/
quelle
Fügen Sie für Benutzer von ASP.NET MVC 5 diesen Code in Ihre BundleConfig.cs ein, um das CDN für jquery zu aktivieren:
quelle
UPDATE:
Diese Antwort hat sich als falsch herausgestellt. Bitte beachten Sie die Kommentare für die wirkliche Erklärung.
Die meisten Ihrer Fragen wurden beantwortet, aber der letzte Teil:
Eigentlich keine. Sie würden Bandbreite verschwenden, möglicherweise einige Millisekunden hinzufügen, um eine zweite nutzlose Kopie herunterzuladen, aber es schadet nicht wirklich, wenn beide durchkommen. Sie sollten dies natürlich mit den oben genannten Techniken vermeiden.
quelle
Ich habe eine Übersicht erstellt, die jQuery dynamisch laden soll, wenn es noch nicht geladen ist. Wenn die Quelle ausfällt, werden Fallbacks (aus vielen Antworten zusammengesetzt) fortgesetzt : https://gist.github.com/tigerhawkvok/9673154
Bitte beachten Sie, dass ich vorhabe, die Liste auf dem neuesten Stand zu halten, aber nicht diese Antwort, für das, was es wert ist!
quelle
Von Google gehostete jQuery
Backup / Fallback Plan!
Referenz: http://websitespeedoptimizations.com/ContentDeliveryNetworkPost.aspx
quelle
Ich denke, dass das letzte <bis \ x3C in der Zeichenfolge entkommen sollte. Wenn der Browser dies sieht, betrachtet er dies als das Ende des Skriptblocks (da der HTML-Parser keine Ahnung von JavaScript hat, kann er nicht zwischen etwas unterscheiden, das nur in einer Zeichenfolge angezeigt wird, und etwas, das das Skript tatsächlich beenden soll Element). Das buchstäbliche Erscheinen in JavaScript innerhalb einer HTML-Seite führt (im besten Fall) zu Fehlern und (im schlimmsten Fall) zu einer großen Sicherheitslücke.
quelle
Oder
Funktioniert nicht, wenn die CDN-Version nicht geladen ist, da der Browser diese Bedingung durchläuft und währenddessen immer noch den Rest der Javascripts herunterlädt, die jQuery benötigen, und einen Fehler zurückgibt. Die Lösung bestand darin, Skripte über diese Bedingung zu laden.
quelle
Fast alle öffentlichen CDNs sind ziemlich zuverlässig. Wenn Sie sich jedoch Sorgen über blockierte Google-Domains machen, können Sie einfach auf ein alternatives jQuery-CDN zurückgreifen . In einem solchen Fall bevorzugen Sie jedoch möglicherweise die umgekehrte Vorgehensweise und verwenden ein anderes CDN als bevorzugte Option und greifen auf Google CDN zurück, um fehlgeschlagene Anforderungen und Wartezeiten zu vermeiden:
quelle
Unter Verwendung der Razor-Syntax in ASP.NET bietet dieser Code Fallback-Unterstützung und arbeitet mit einem virtuellen Stammverzeichnis:
Oder machen Sie einen Helfer ( Helferübersicht ):
und benutze es so:
quelle
CdnScript
Helfer benötigen Sie nur eine Codezeile pro Skript . Je mehr Skripte Sie haben, desto höher ist die Auszahlung.try { for (Script s : ...) cdnLoad(s); } catch (...) { for (Script s : ...) ownLoad(s); }
. Dies in ein paarif
s zu übersetzen, könnte ein Albtraum sein.Obwohl das Schreiben
document.write("<script></script>")
für jQuery-Backoff einfacher zu sein scheint, gibt Chrome in diesem Fall einen Validierungsfehler aus. Also ziehe ich es vor, "Skript" -Wort zu brechen. So wird es sicherer wie oben.Bei langfristigen Problemen ist es besser, JQuery-Fallbacks zu protokollieren. Wenn im ersten Code das erste CDN nicht verfügbar ist, wird JQuery von einem anderen CDN geladen. Aber vielleicht möchten Sie dieses fehlerhafte CDN kennen und dauerhaft entfernen. (Dieser Fall ist ein sehr außergewöhnlicher Fall.) Es ist auch besser, Fallback-Probleme zu protokollieren. So können Sie mit AJAX fehlerhafte Fälle senden. Da JQuery nicht definiert ist, sollten Sie Vanille-Javascript für AJAX-Anforderungen verwenden.
quelle
Die Unfähigkeit, die Ressource aus einem externen Datenspeicher zu laden, der außerhalb Ihrer Kontrolle liegt, ist schwierig. Das Suchen nach fehlenden Funktionen ist völlig trügerisch, um eine Zeitüberschreitung zu vermeiden, wie hier beschrieben: http://www.tech-101.com/support/topic/4499-issues-using-a-cdn/
quelle
Ein weiterer Fallback, der ajax.googleapis.com durch ersetzt cdnjs.cloudflare.com ersetzt :
quelle
Sie können Code verwenden wie:
Es gibt aber auch Bibliotheken, mit denen Sie mehrere mögliche Fallbacks für Ihre Skripte einrichten und den Ladevorgang optimieren können:
Beispiele:
korb.js Ich denke die beste Variante für jetzt. Wird Ihr Skript im localStorage zwischenspeichern, wodurch das nächste Laden beschleunigt wird. Der einfachste Anruf:
Dies gibt ein Versprechen zurück und Sie können den nächsten Fehleraufruf ausführen oder Abhängigkeiten vom Erfolg laden:
RequireJS
Ja, nein
quelle