¿Cuál sería una buena manera de intentar cargar jQuery alojado en Google (u otras bibliotecas alojadas en Google), pero cargar mi copia de jQuery si falla el intento de Google?
No digo que Google sea escamoso. Hay casos en los que la copia de Google está bloqueada (aparentemente en Irán, por ejemplo).
¿Configuraría un temporizador y buscaría el objeto jQuery?
¿Cuál sería el peligro de que salgan ambas copias?
En realidad, no estoy buscando respuestas como "solo usa Google" o "solo usa la tuya". Entiendo esos argumentos. También entiendo que es probable que el usuario tenga en caché la versión de Google. Estoy pensando en retrocesos para la nube en general.
Editar: Esta parte agregó ...
Dado que Google sugiere usar google.load para cargar las bibliotecas ajax, y realiza una devolución de llamada cuando termine, me pregunto si esa es la clave para serializar este problema.
Sé que suena un poco loco. Solo estoy tratando de averiguar si se puede hacer de manera confiable o no.
Actualización: jQuery ahora alojado en el CDN de Microsoft.
fuente
Respuestas:
Puedes lograrlo así:
Esto debe estar en su página
<head>
y cualquier controlador de eventos listo para jQuery debe estar en el<body>
para evitar errores (¡aunque no es infalible!).Una razón más para no usar jQuery alojado en Google es que en algunos países, el nombre de dominio de Google está prohibido.
fuente
La forma más fácil y limpia de hacer esto con diferencia:
fuente
XHTML 1.0
yHTML 4.01
type="text/javascript"
partes, así que para las personas que escriben html para navegadores antiguos, tengan en cuenta que ahora tendrán que agregar eso.type="text/javascript"
era innecesario en los navegadores más antiguos, ya que todos estaban predeterminados en Javascript. Los navegadores realmente más antiguos observaron ellanguage
atributo; pero incluso entonces, Javascript era el predeterminado si faltaba el atributo.<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>
Esto parece funcionar para mí:
La forma en que funciona es usar el
google
objeto que llama a http://www.google.com/jsapi carga en elwindow
objeto. Si ese objeto no está presente, estamos asumiendo que el acceso a Google está fallando. Si ese es el caso, cargamos una copia local usandodocument.write
. (Estoy usando mi propio servidor en este caso, use el suyo para probar esto).También pruebo la presencia de
window.google.load
: también podría hacer unatypeof
comprobación para ver si las cosas son objetos o funciones, según corresponda. Pero creo que esto funciona.Aquí está solo la lógica de carga, ya que el resaltado de código parece fallar desde que publiqué toda la página HTML que estaba probando:
Aunque debo decir que no estoy seguro de que si esto es una preocupación para los visitantes de su sitio, deba jugar con la API de bibliotecas AJAX de Google .
Dato curioso : al principio intenté usar un bloque try..catch para esto en varias versiones, pero no pude encontrar una combinación tan limpia como esta. Me interesaría ver otras implementaciones de esta idea, simplemente como un ejercicio.
fuente
Si tiene modernizr.js incrustado en su sitio, puede usar yepnope.js incorporado para cargar sus scripts de forma asincrónica, entre otros, jQuery (con respaldo).
Esto carga jQuery del Google-cdn. Luego se verifica si jQuery se cargó correctamente. Si no ("no"), se carga la versión local. También se cargan sus scripts personales: el "ambos" indica que el proceso de carga se inicia independientemente del resultado de la prueba.
Cuando todos los procesos de carga están completos, se ejecuta una función, en el caso 'MyApp.init'.
Personalmente, prefiero esta forma de carga asíncrona de scripts. Y como confío en las pruebas de características proporcionadas por modernizr cuando construyo un sitio, lo tengo incrustado en el sitio de todos modos. Entonces, en realidad no hay gastos generales.
fuente
yepnope.js
está en desuso. ver stackoverflow.com/questions/33986561/…Aquí hay algunas soluciones excelentes, pero me gustaría ir un paso más allá con respecto al archivo local.
En un escenario en el que Google falla, debería cargar una fuente local, pero tal vez un archivo físico en el servidor no sea necesariamente la mejor opción. Menciono esto porque actualmente estoy implementando la misma solución, solo que quiero recurrir a un archivo local que se genera por una fuente de datos.
Mis razones para esto es que quiero tener algo de mente cuando se trata de realizar un seguimiento de lo que cargo de Google frente a lo que tengo en el servidor local. Si quiero cambiar las versiones, querré mantener mi copia local sincronizada con lo que estoy tratando de cargar desde Google. En un entorno donde hay muchos desarrolladores, creo que el mejor enfoque sería automatizar este proceso para que todo lo que uno tuviera que hacer fuera cambiar un número de versión en un archivo de configuración.
Aquí está mi solución propuesta que debería funcionar en teoría:
En teoría, si mi código está escrito correctamente, todo lo que tendría que hacer es cambiar el número de versión en la configuración de mi aplicación y luego ¡viola! Tiene una solución alternativa que está automatizada y no tiene que mantener archivos físicos en su servidor.
¿Qué piensan todos? Tal vez esto sea excesivo, pero podría ser un método elegante para mantener sus bibliotecas AJAX.
Bellota
fuente
Después de intentar incluir la copia de Google del CDN.
En HTML5, no necesita establecer el
type
atributo.También puedes usar...
fuente
[Violation] Avoid using document.write().
Es posible que desee utilizar su archivo local como último recurso.
Parece que a partir de ahora, la propia CDN de jQuery no es compatible con https. Si lo hizo, es posible que desee cargar desde allí primero.
Así que aquí está la secuencia: Google CDN => Microsoft CDN => Su copia local.
fuente
Cargue condicionalmente la última versión / legacy de jQuery y respaldo:
fuente
jQuery
variable)Cómo verificar una variable no definida en JavaScript
¿Cómo incluyo un archivo JavaScript en otro archivo JavaScript?
fuente
Debido al problema de prohibición de Google, prefiero usar el cdn de Microsoft http://www.asp.net/ajaxlibrary/cdn.ashx
fuente
¡Aquí hay una gran explicación sobre esto!
¡También implementa retrasos de carga y tiempos de espera!
http://happyworm.com/blog/2010/01/28/a-simple-and-robust-cdn-failover-for-jquery-14-in-one-line/
fuente
Para aquellas personas que usan ASP.NET MVC 5, agregue este código en su BundleConfig.cs para habilitar el CDN para jquery:
fuente
ACTUALIZACIÓN:
Esta respuesta resultó ser incorrecta. Por favor, vea los comentarios para la explicación real.
La mayoría de sus preguntas han sido respondidas, pero en cuanto a la parte final:
Ninguno realmente Perdería el ancho de banda, podría agregar algunos milisegundos descargando una segunda copia inútil, pero no hay ningún daño real si ambos salen adelante. Por supuesto, debe evitar esto utilizando las técnicas mencionadas anteriormente.
fuente
Hice un Gist que debería cargar dinámicamente jQuery si aún no está cargado, y si la fuente falla, procede a fallos (unidos entre muchas respuestas): https://gist.github.com/tigerhawkvok/9673154
Tenga en cuenta que planeo mantener el Gist actualizado, pero no esta respuesta, ¡por lo que vale!
fuente
Google Hosted jQuery
Plan de copia de seguridad / respaldo!
Referencia: http://websitespeedoptimizations.com/ContentDeliveryNetworkPost.aspx
fuente
Considero que debería escapar del último <a \ x3C en cadena. Cuando el navegador ve, considera que este es el final del bloque de secuencia de comandos (dado que el analizador HTML no tiene idea sobre JavaScript, no puede distinguir entre algo que solo aparece en una cadena y algo que en realidad está destinado a finalizar la secuencia de comandos elemento). Entonces, aparecer literalmente en JavaScript que está dentro de una página HTML causará (en el mejor de los casos) errores y (en el peor de los casos) será un gran agujero de seguridad.
fuente
O
No funcionará si la versión de cdn no está cargada, porque el navegador se ejecutará en esta condición y durante la descarga del resto de javascripts que necesitan jQuery y devuelve un error. La solución fue cargar scripts a través de esa condición.
fuente
Casi todos los CDN públicos son bastante confiables. Sin embargo, si le preocupa el dominio de google bloqueado, simplemente puede recurrir a un CDN de jQuery alternativo . Sin embargo, en tal caso, es posible que prefiera hacerlo de manera opuesta y usar alguna otra CDN como su opción preferida y recurrir a Google CDN para evitar solicitudes fallidas y tiempos de espera:
fuente
Usando la sintaxis Razor en ASP.NET, este código proporciona soporte alternativo y funciona con una raíz virtual:
O haga un ayudante ( descripción general del ayudante ):
y úsalo así:
fuente
CdnScript
asistente, solo necesita una línea de código por secuencia de comandos . Cuantos más guiones tenga, mayor será la recompensa.try { for (Script s : ...) cdnLoad(s); } catch (...) { for (Script s : ...) ownLoad(s); }
. Traducir esto en un montón deif
s podría ser una pesadilla.Aunque escribir
document.write("<script></script>")
parece más fácil para el back-end de jQuery, Chrome da un error de validación en ese caso. Así que prefiero romper la palabra "script". Entonces se vuelve más seguro como arriba.Para problemas a largo plazo, sería mejor registrar las fallas de respaldo de JQuery. En el código anterior, si el primer CDN no está disponible, JQuery se carga desde otro CDN. Pero es posible que desee saber ese CDN erróneo y eliminarlo permanentemente. (este es un caso muy excepcional) También es mejor registrar problemas de reserva. Entonces puede enviar casos erróneos con AJAX. Debido a que JQuery no está definido, debe usar JavaScript de vainilla para la solicitud de AJAX.
fuente
La imposibilidad de cargar el recurso desde un almacén de datos externo más allá de su control es difícil. Buscar funciones faltantes es totalmente falaz como un medio para evitar sufrir un tiempo de espera, como se describe aquí: http://www.tech-101.com/support/topic/4499-issues-using-a-cdn/
fuente
Otra alternativa que reemplaza ajax.googleapis.com con cdnjs.cloudflare.com :
fuente
Puedes usar código como:
Pero también hay bibliotecas que puede usar para configurar varios posibles retrocesos para sus scripts y optimizar el proceso de carga:
Ejemplos:
basket.js Creo que la mejor variante por ahora. Guardará su script en el almacenamiento local, lo que acelerará las próximas cargas. La llamada más simple:
Esto devolverá una promesa y puede hacer la próxima llamada por error, o cargar dependencias en caso de éxito:
RequireJS
sipnope
fuente