Je crée un lien vers la feuille de style jQuery Mobile sur un CDN et j'aimerais revenir à ma version locale de la feuille de style si le CDN échoue. Pour les scripts, la solution est bien connue:
<!-- Load jQuery and jQuery mobile with fall back to local server -->
<script src="http://code.jquery.com/jquery-1.6.3.min.js"></script>
<script type="text/javascript">
if (typeof jQuery == 'undefined') {
document.write(unescape("%3Cscript src='jquery-1.6.3.min.js'%3E"));
}
</script>
Je voudrais faire quelque chose de similaire pour une feuille de style:
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0b3/jquery.mobile-1.0b3.min.css" />
Je ne suis pas sûr qu'une approche similaire puisse être réalisée car je ne suis pas sûr que le navigateur se bloque de la même manière lors de la liaison d'un script que lors du chargement d'un script (il est peut-être possible de charger une feuille de style dans une balise de script, puis l'injecter dans la page)?
Ma question est donc la suivante: comment m'assurer qu'une feuille de style est chargée localement en cas d'échec d'un CDN?
Réponses:
Pas testé sur plusieurs navigateurs, mais je pense que cela fonctionnera. Cela devra être après le chargement de jquery, ou vous devrez le réécrire en Javascript.
la source
CSSStyleSheet
objets js qui proviennent de bootstrapcdn.com ont tous des champs videsrules
etcssRules
dans mon navigateur (Chrome 31). UPD : cela pourrait en fait être un problème de multi-domaines, le fichier css dans la réponse ne fonctionne pas non plus pour moi.onerror
événement. stackoverflow.com/questions/30546795/….rules
/.cssRules
pour les feuilles de style externes. jsfiddle.net/E6yYN/13Je suppose que la question est de détecter si une feuille de style est chargée ou non. Une approche possible est la suivante:
1) Ajoutez une règle spéciale à la fin de votre fichier CSS, comme:
2) Ajoutez le div correspondant dans votre HTML:
3) Sur le document prêt, vérifiez s'il
#foo
est visible ou non. Si la feuille de style a été chargée, elle ne sera pas visible.Démo ici - charge le thème de douceur jquery-ui; aucune règle n'est ajoutée à la feuille de style.
la source
En supposant que vous utilisez le même CDN pour css et jQuery, pourquoi ne pas faire un seul test et tout attraper?
la source
document.write("<script type='text/javascript' src='path/to/file.js'>")
?<script>
une chaîne JS à l'intérieur et une chaîne trouvée à l'extérieur. C'est généralement la raison pour laquelle vous voyez également<\/script>
lors de l'écriture de balises pour les solutions de secours CDN.why not just do one test and catch it all?
- Parce qu'il y a un million de raisons pour lesquelles l'une peut échouer, et les autres réussissent.cet article suggère quelques solutions pour le bootstrap css http://eddmann.com/posts/providing-local-js-and-css-resources-for-cdn-fallbacks/
sinon cela fonctionne pour fontawesome
la source
Vous pourrez peut- être tester l’existence de la feuille de style dans
document.styleSheets
.Testez quelque chose de spécifique au fichier CSS que vous utilisez.
la source
On pourrait utiliser
onerror
pour cela:Le but
this.onerror=null;
est d'éviter les boucles sans fin au cas où le repli lui-même ne serait pas disponible. Mais il pourrait également être utilisé pour avoir plusieurs solutions de secours.Cependant, cela ne fonctionne actuellement que dans Firefox et Chrome.
la source
Voici une extension de la réponse de Katy Lavallee. J'ai tout enveloppé dans une syntaxe de fonction auto-exécutable pour éviter les collisions de variables. J'ai également rendu le script non spécifique à un seul lien. IE, maintenant tout lien de feuille de style avec un attribut URL "data-fallback" sera automatiquement analysé. Vous n'avez pas à coder en dur les URL dans ce script comme auparavant. Notez que cela devrait être exécuté à la fin de l'
<head>
élément plutôt qu'à la fin de l'<body>
élément, sinon cela pourrait provoquer un FOUC .http://jsfiddle.net/skibulk/jnfgyrLt/
.
la source
document.styleSheets[i].ownerNode.dataset
vous pouvez accéder aux<link data-* />
attributsVoulez-vous vraiment emprunter cette route javascript pour charger du CSS en cas d'échec d'un CDN?
Je n'ai pas pensé à toutes les implications sur les performances, mais vous allez perdre le contrôle du chargement du CSS et en général pour les performances de chargement de la page, CSS est la première chose que vous voulez télécharger après le HTML.
Pourquoi ne pas gérer cela au niveau de l'infrastructure - mappez votre propre nom de domaine sur le CDN, donnez-lui un court TTL, surveillez les fichiers sur le CDN (par exemple en utilisant Watchmouse ou autre chose), si le CDN échoue, changez le DNS en site de sauvegarde.
D'autres options qui pourraient aider sont le "cache pour toujours" sur le contenu statique, mais il n'y a aucune garantie que le navigateur les conservera bien sûr ou en utilisant le cache d'application.
En réalité, comme quelqu'un l'a dit en haut, si votre CDN n'est pas fiable, procurez-vous un nouveau
Andy
la source
Regardez ces fonctions:
Et voici la version JavaScript vanille:
Maintenant la fonction réelle:
Assurez-vous simplement que AddLocalCss est appelé dans la tête.
Vous pouvez également envisager d'utiliser l'une des méthodes suivantes expliquées dans cette réponse :
Charger avec AJAX
Charger à l'aide de
ou
la source
J'utiliserais probablement quelque chose comme yepnope.js
Tiré du fichier readme.
la source
la source