Quelle serait une bonne façon de tenter de charger la jQuery hébergée sur Google (ou d'autres bibliothèques hébergées par Google ), mais de charger ma copie de jQuery si la tentative de Google échoue?
Je ne dis pas que Google est floconneux. Il y a des cas où la copie de Google est bloquée (apparemment en Iran, par exemple).
Vais-je configurer une minuterie et vérifier l'objet jQuery?
Quel serait le danger que les deux copies passent?
Pas vraiment à la recherche de réponses comme «utilisez simplement celle de Google» ou «utilisez simplement la vôtre». Je comprends ces arguments. Je comprends également que l'utilisateur aura probablement la version Google en cache. Je pense aux solutions de rechange pour le cloud en général.
Edit: Cette partie a ajouté ...
Étant donné que Google suggère d'utiliser google.load pour charger les bibliothèques ajax et qu'il effectue un rappel une fois terminé, je me demande si c'est la clé pour sérialiser ce problème.
Je sais que ça semble un peu fou. J'essaie simplement de savoir si cela peut être fait de manière fiable ou non.
Mise à jour: jQuery désormais hébergé sur le CDN de Microsoft.
la source
Réponses:
Vous pouvez le réaliser comme ceci:
Cela devrait être dans votre page
<head>
et tous les gestionnaires d'événements prêts pour jQuery devraient être dans le<body>
pour éviter les erreurs (bien que ce ne soit pas infaillible!).Une autre raison de ne pas utiliser jQuery hébergé par Google est que dans certains pays, le nom de domaine de Google est interdit.
la source
La façon la plus simple et la plus propre de le faire de loin:
la source
XHTML 1.0
etHTML 4.01
type="text/javascript"
parties, donc aux gens qui écrivent du HTML pour les anciens navigateurs, notez que vous devrez maintenant l'ajouter.type="text/javascript"
était également inutile dans les anciens navigateurs, car ils étaient tous par défaut en Javascript. Les navigateurs vraiment plus anciens ont examiné l'language
attribut; mais même alors, Javascript était la valeur par défaut si l'attribut manquait.<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>
Cela semble fonctionner pour moi:
La façon dont cela fonctionne consiste à utiliser l'
google
objet que l'appel http://www.google.com/jsapi charge sur l'window
objet. Si cet objet n'est pas présent, nous supposons que l'accès à Google échoue. Si tel est le cas, nous chargeons une copie locale à l'aide dedocument.write
. (J'utilise mon propre serveur dans ce cas, veuillez utiliser le vôtre pour le tester).Je teste également la présence de
window.google.load
- je pourrais également faire unetypeof
vérification pour voir que les choses sont des objets ou des fonctions appropriées. Mais je pense que cela fait l'affaire.Voici juste la logique de chargement, car la mise en évidence du code semble échouer depuis que j'ai posté la page HTML entière que je testais:
Bien que je doive dire, je ne suis pas sûr que si cela préoccupe les visiteurs de votre site, vous devriez jouer avec l' API Google AJAX Libraries .
Fait amusant : j'ai d'abord essayé d'utiliser un bloc try..catch pour cela dans différentes versions, mais je n'ai pas pu trouver une combinaison aussi propre que celle-ci. Je serais intéressé de voir d'autres implémentations de cette idée, purement comme un exercice.
la source
Si vous avez modernizr.js intégré sur votre site, vous pouvez utiliser le yepnope.js intégré pour charger vos scripts de manière asynchrone - entre autres jQuery (avec repli).
Cela charge jQuery à partir de Google-cdn. Ensuite, il est vérifié si jQuery a été chargé avec succès. Sinon ("non"), la version locale est chargée. Vos scripts personnels sont également chargés - les «deux» indiquent que le processus de chargement est initié indépendamment du résultat du test.
Lorsque tous les processus de chargement sont terminés, une fonction est exécutée, dans le cas 'MyApp.init'.
Personnellement, je préfère cette méthode de chargement de script asynchrone. Et comme je me fie aux tests de fonctionnalités fournis par modernizr lors de la construction d'un site, je l'ai quand même intégré au site. Il n'y a donc pas de frais généraux.
la source
yepnope.js
est obsolète. voir stackoverflow.com/questions/33986561/…Il existe d'excellentes solutions ici, mais j'aimerais aller plus loin en ce qui concerne le fichier local.
Dans un scénario où Google échoue, il devrait charger une source locale, mais peut-être qu'un fichier physique sur le serveur n'est pas nécessairement la meilleure option. J'en parle parce que j'implémente actuellement la même solution, seulement je veux revenir à un fichier local qui est généré par une source de données.
Mes raisons sont que je veux avoir une certaine tranquillité d'esprit quand il s'agit de garder une trace de ce que je charge de Google par rapport à ce que j'ai sur le serveur local. Si je veux changer de version, je veux garder ma copie locale synchronisée avec ce que j'essaye de charger depuis Google. Dans un environnement où il y a beaucoup de développeurs, je pense que la meilleure approche serait d'automatiser ce processus pour qu'il ne reste plus qu'à changer un numéro de version dans un fichier de configuration.
Voici ma solution proposée qui devrait fonctionner en théorie:
En théorie, si mon code est écrit correctement, tout ce que je devrais faire est de changer le numéro de version dans la configuration de mon application puis l'alto! Vous disposez d'une solution de secours automatisée et vous n'avez pas besoin de conserver des fichiers physiques sur votre serveur.
Que pense tout le monde? C'est peut-être exagéré, mais cela pourrait être une méthode élégante pour maintenir vos bibliothèques AJAX.
Gland
la source
Après avoir tenté d'inclure la copie de Google à partir du CDN.
En HTML5, vous n'avez pas besoin de définir l'
type
attribut.Vous pouvez aussi utiliser...
la source
[Violation] Avoid using document.write().
Vous voudrez peut-être utiliser votre fichier local en dernier recours.
Il semble que le propre CDN de jQuery ne prend pas en charge https. Si c'est le cas, vous voudrez peut-être d'abord charger à partir de là.
Voici donc la séquence: Google CDN => Microsoft CDN => Votre copie locale.
la source
Charger conditionnellement la dernière version / héritée de jQuery et son remplacement:
la source
jQuery
variable)Comment vérifier une variable non définie en JavaScript
Comment inclure un fichier JavaScript dans un autre fichier JavaScript?
la source
En raison du problème d'interdiction de Google, je préfère utiliser le cdn de Microsoft http://www.asp.net/ajaxlibrary/cdn.ashx
la source
Voici une excellente explication à ce sujet!
Implémente également les délais de chargement et les délais d'attente!
http://happyworm.com/blog/2010/01/28/a-simple-and-robust-cdn-failover-for-jquery-14-in-one-line/
la source
Pour les personnes utilisant ASP.NET MVC 5, ajoutez ce code dans vos BundleConfig.cs pour activer le CDN pour jquery:
la source
MISE À JOUR:
Cette réponse s'est avérée fausse. Veuillez voir les commentaires pour la vraie explication.
La plupart d'entre vous ont répondu, mais comme pour la dernière partie:
Pas vraiment. Vous perdriez de la bande passante, vous pourriez ajouter quelques millisecondes en téléchargeant une seconde copie inutile, mais il n'y a pas de réel préjudice si les deux arrivent. Vous devez bien sûr éviter cela en utilisant les techniques mentionnées ci-dessus.
la source
J'ai créé un Gist qui devrait charger dynamiquement jQuery s'il n'est pas déjà chargé, et si la source échoue, il passe aux solutions de rechange (assemblées à partir de nombreuses réponses): https://gist.github.com/tigerhawkvok/9673154
Veuillez noter que je prévois de garder le Gist à jour mais pas cette réponse, pour ce que ça vaut!
la source
Google Hosted jQuery
Plan de sauvegarde / repli!
Référence: http://websitespeedoptimizations.com/ContentDeliveryNetworkPost.aspx
la source
Je considère que cela devrait échapper au dernier <à \ x3C de la chaîne. Lorsque le navigateur le voit, il considère que c'est la fin du bloc de script (puisque l'analyseur HTML n'a aucune idée de JavaScript, il ne peut pas faire la distinction entre quelque chose qui apparaît simplement dans une chaîne et quelque chose qui est réellement destiné à mettre fin au script élément). Ainsi, apparaître littéralement en JavaScript à l'intérieur d'une page HTML provoquera (dans le meilleur des cas) des erreurs et (dans le pire des cas) constituera un énorme trou de sécurité.
la source
Ou
Ne fonctionnera pas si la version cdn n'est pas chargée, car le navigateur exécutera cette condition et pendant le téléchargement du reste des javascripts qui nécessitent jQuery et cela renvoie une erreur. La solution consistait à charger des scripts via cette condition.
la source
Presque tous les CDN publics sont assez fiables. Cependant, si vous vous inquiétez du domaine google bloqué, vous pouvez simplement revenir à un CDN jQuery alternatif . Cependant, dans un tel cas, vous pouvez préférer le faire de manière opposée et utiliser un autre CDN comme option préférée et revenir à Google CDN pour éviter les demandes échouées et le temps d'attente:
la source
À l'aide de la syntaxe Razor dans ASP.NET, ce code fournit une prise en charge de secours et fonctionne avec une racine virtuelle:
Ou créez une aide ( aperçu de l'aide ):
et utilisez-le comme ceci:
la source
CdnScript
aide, vous n'avez besoin que d'une seule ligne de code par script . Plus vous avez de scripts, plus le gain est important.try { for (Script s : ...) cdnLoad(s); } catch (...) { for (Script s : ...) ownLoad(s); }
. Traduire cela en un tas deif
s pourrait être un cauchemar.Bien que l'écriture
document.write("<script></script>")
semble plus facile pour le backoff de jQuery, Chrome donne une erreur de validation sur ce cas. Je préfère donc casser le mot "script". Il devient donc plus sûr comme ci-dessus.Pour les problèmes à long terme, il serait préférable de consigner les solutions de repli JQuery. Dans le code ci-dessus, si le premier CDN n'est pas disponible, JQuery est chargé à partir d'un autre CDN. Mais vous pouvez vouloir connaître ce CDN erroné et le supprimer définitivement. (ce cas est un cas très exceptionnel) Il est également préférable de consigner les problèmes de secours. Vous pouvez donc envoyer des cas erronés avec AJAX. Étant donné que JQuery n'est pas défini, vous devez utiliser du vanilla javascript pour la demande AJAX.
la source
L'incapacité de charger la ressource à partir d'un magasin de données externe indépendant de votre volonté est difficile. La recherche de fonctions manquantes est totalement fallacieuse pour éviter de subir un timeout, comme décrit ici: http://www.tech-101.com/support/topic/4499-issues-using-a-cdn/
la source
Encore une autre solution de rechange qui remplace ajax.googleapis.com par cdnjs.cloudflare.com :
la source
Vous pouvez utiliser du code comme:
Mais il existe également des bibliothèques que vous pouvez utiliser pour configurer plusieurs solutions de rechange possibles pour vos scripts et optimiser le processus de chargement:
Exemples:
basket.js Je pense que la meilleure variante pour l'instant. Va mettre votre script en cache dans le localStorage, ce qui accélérera les prochains chargements. L'appel le plus simple:
Cela renverra une promesse et vous pouvez faire le prochain appel en cas d'erreur ou charger les dépendances en cas de succès:
RequireJS
yepnope
la source