Estoy enlazando a la hoja de estilo de jQuery Mobile en un CDN y me gustaría volver a mi versión local de la hoja de estilo si el CDN falla. Para los scripts, la solución es bien conocida:
<!-- 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>
Me gustaría hacer algo similar para una hoja de estilo:
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0b3/jquery.mobile-1.0b3.min.css" />
No estoy seguro de si se puede lograr un enfoque similar porque no estoy seguro de si el navegador se bloquea de la misma manera cuando se vincula un script que cuando se carga un script (tal vez sea posible cargar una hoja de estilo en una etiqueta de script y luego inyectarlo en la página)?
Entonces, mi pregunta es: ¿Cómo me aseguro de que una hoja de estilo se cargue localmente si falla una CDN?
Respuestas:
No probado en varios navegadores, pero creo que esto funcionará. Sin embargo, tendrá que ser después de cargar jquery, o tendrá que reescribirlo en JavaScript simple.
fuente
CSSStyleSheet
objetos js que provienen de bootstrapcdn.com tienen campos vacíosrules
ycssRules
en mi navegador (Chrome 31). UPD : en realidad, podría ser un problema de dominio cruzado, el archivo css en la respuesta tampoco funciona para mí.onerror
evento. stackoverflow.com/questions/30546795/….rules
/.cssRules
para hojas de estilo externas. jsfiddle.net/E6yYN/13Supongo que la pregunta es detectar si una hoja de estilo está cargada o no. Un posible enfoque es el siguiente:
1) Agregue una regla especial al final de su archivo CSS, como:
2) Agregue el div correspondiente en su HTML:
3) Cuando el documento esté listo, compruebe si
#foo
está visible o no. Si se cargó la hoja de estilo, no será visible.Demostración aquí : carga el tema de suavidad jquery-ui; no se agrega ninguna regla a la hoja de estilo.
fuente
Suponiendo que está utilizando el mismo CDN para css y jQuery, ¿por qué no hacer una prueba y capturarlo todo?
fuente
document.write("<script type='text/javascript' src='path/to/file.js'>")
?<script>
interior de una cadena JS y uno que se encuentra fuera. Por lo general, esta es la razón por la que también se ve<\/script>
al escribir etiquetas para alternativas de CDN.why not just do one test and catch it all?
- Porque hay un millón de razones por las que una puede fallar y las otras triunfan.este artículo sugiere algunas soluciones para bootstrap css http://eddmann.com/posts/pro provide-local-js-and-css-resources-for-cdn-fallbacks/
alternativamente, esto funciona para fontawesome
fuente
Es posible que pueda probar la existencia de la hoja de estilo en
document.styleSheets
.Prueba algo específico del archivo CSS que estás usando.
fuente
Uno podría usar
onerror
para eso:El
this.onerror=null;
objetivo es evitar bucles sin fin en caso de que el respaldo en sí no esté disponible. Pero también podría usarse para tener múltiples alternativas.Sin embargo, esto actualmente solo funciona en Firefox y Chrome.
fuente
Aquí hay una extensión de la respuesta de katy lavallee. Envolví todo en la sintaxis de funciones autoejecutables para evitar colisiones de variables. También hice que el script no sea específico para un solo enlace. Es decir, ahora se analizará automáticamente cualquier vínculo de hoja de estilo con un atributo de URL "data-fallback". No es necesario que codifique las URL en este script como antes. Tenga en cuenta que esto debe ejecutarse al final del
<head>
elemento en lugar de al final del<body>
elemento, de lo contrario, podría causar FOUC .http://jsfiddle.net/skibulk/jnfgyrLt/
.
fuente
document.styleSheets[i].ownerNode.dataset
puede acceder a los<link data-* />
atributos¿Realmente desea seguir esta ruta de JavaScript para cargar CSS en caso de que falle una CDN?
No he pensado en todas las implicaciones de rendimiento, pero perderá el control de cuándo se carga el CSS y, en general, para el rendimiento de carga de la página, CSS es lo primero que desea descargar después del HTML.
¿Por qué no manejar esto a nivel de infraestructura? Asigne su propio nombre de dominio a la CDN, dele un TTL corto, monitoree los archivos en la CDN (por ejemplo, usando Watchmouse u otra cosa), si la CDN falla, cambie el DNS al sitio de respaldo.
Otras opciones que pueden ayudar son "almacenar en caché para siempre" en contenido estático, pero no hay garantía de que el navegador las mantenga, por supuesto, o que use la caché de la aplicación.
En realidad, como dijo alguien en la parte superior, si su CDN no es confiable, obtenga uno nuevo
Andy
fuente
Mira estas funciones:
Y aquí está la versión vainilla de JavaScript:
Ahora la función real:
Solo asegúrese de que se llame a AddLocalCss en el encabezado.
También podría considerar usar una de las siguientes formas explicadas en esta respuesta :
Cargar usando AJAX
Cargar usando creado dinámicamente
o
fuente
Probablemente usaría algo como yepnope.js
Tomado del archivo Léame.
fuente
fuente