1004 votos

La mejor manera de utilizar Google hosted jQuery, pero vuelven a caer en mi alojado en la biblioteca de Google fallar

¿Cuál sería una buena manera de intentar cargar la alojado jQuery en Google (u otros alojada en Google libs), pero la carga de mi copia de jQuery si Google intento falla?

No estoy diciendo que Google es escamosa. Hay casos en que Google copia está bloqueado (al parecer, en Irán, por ejemplo).

Habría de establecer un temporizador y verificación para el objeto jQuery?

¿Cuál sería el peligro de que las dos copias que viene a través de?

No realmente en busca de respuestas como "apenas uso el Google" o "sólo tiene que utilizar su propio." Entiendo los argumentos. También entiendo que el usuario pueda tener el Google la versión almacenada en caché. Estoy pensando en alternativas para la nube en general.


Edit: Esta parte añadida...

Desde que Google sugiere el uso de google.load para cargar las bibliotecas de ajax, y se realiza una devolución de llamada cuando se hace, me pregunto si esa es la clave para serializar este problema.

Sé que suena un poco loco. Sólo estoy tratando de averiguar si se puede hacer de una manera confiable o no.


Actualización: jQuery ahora alojado en Microsoft CDN.

http://www.asp.net/ajax/cdn/

797voto

Rony Puntos 6340

Usted puede lograr algo como esto:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
<script>
if (!window.jQuery) {
    document.write('<script src="/path/to/your/jquery"><\/script>');
}
</script>

Esto debería estar en su página <head> y cualquier jQuery listos los controladores de eventos debe estar en la <body> para evitar errores (aunque no infalible!).

Una razón más para no usar alojada en Google de jQuery es que en algunos países, Google del nombre de dominio está prohibido.

333voto

BenjaminRH Puntos 4540

La forma más fácil y limpia de hacer esto por ahora:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="path/to/your/jquery"><\/script>')</script>

75voto

artlung Puntos 13433

Esto parece funcionar para mí:

<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
// has the google object loaded?
if (window.google && window.google.load) {
    google.load("jquery", "1.3.2");
} else {
    document.write('<script type="text/javascript" src="http://joecrawford.com/jquery-1.3.2.min.js"><\/script>');
}
window.onload = function() {
    $('#test').css({'border':'2px solid #f00'});
};
</script>
</head>
<body>
    <p id="test">hello jQuery</p>
</body>
</html>

La forma en que funciona es utilizar la google objeto que llamar http://www.google.com/jsapi carga en la window objeto. Si el objeto no está presente, estamos asumiendo que el acceso a Google está fallando. Si ese es el caso, se carga una copia local utilizando document.write. (Estoy usando mi propio servidor en este caso, por favor utilice su propia para la prueba de esto).

Yo también la prueba para la presencia de window.google.load - yo también podría hacer una typeof compruebe que las cosas son objetos o funciones, según corresponda. Pero creo que esto hace el truco.

Aquí tienes la carga de la lógica, desde el resaltado de código parece fallar desde que he publicado a toda página HTML se estaba probando:

if (window.google && window.google.load) {
        google.load("jquery", "1.3.2");
    } else {
        document.write('<script type="text/javascript" src="http://joecrawford.com/jquery-1.3.2.min.js"><\/script>');
    }

Aunque debo decir, no estoy seguro de que si esto es una preocupación para los visitantes de su sitio debe estar jugando con el Google AJAX Libraries API .

Dato curioso: he intentado inicialmente para utilizar un bloque try..catch para esto en varias versiones, pero no pudo encontrar una combinación que era tan limpio como este. Yo estaría interesado en ver otras implementaciones de esta idea, puramente como un ejercicio.

30voto

Emanuel Kluge Puntos 319

si usted tiene modernizr.js incrustado en su sitio, usted puede utilizar el built-in yepnope.js para cargar los scripts de forma asincrónica - entre otros jquery (con reserva).

Modernizr.load([{
    load : '//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'
},{
    test : window.jQuery,
    nope : 'path/to/local/jquery-1.7.2.min.js',
    both : ['myscript.js', 'another-script.js'],
    complete : function () {
        MyApp.init();
    }
}]);

esta carga jquery desde google-cdn. posteriormente se comprobará, si jquery se ha cargado con éxito. si no ("no"), la versión local es cargado. también personal de los guiones cargados - el "tanto" indica que la carga de proceso es iniated independientemente del resultado de la prueba.

cuando toda la carga-los procesos son completos, una función que se ejecuta, en el caso de 'MyApp.init'.

yo personalmente prefiero esta forma de asincrónicas script de carga. y como he dependen de la característica-pruebas proporcionadas por modernizr cuando la construcción de un sitio, la tengo incrustada en el sitio, de todos modos. así que no hay realmente ninguna sobrecarga.

21voto

Acorn Puntos 606

Hay algunos grandes soluciones aquí, pero me gustaría dar un paso más sobre el archivo local.

En un escenario cuando Google no fallan, se debe cargar una fuente local, pero tal vez una física del archivo en el servidor no es necesariamente la mejor opción. Menciono esto porque actualmente estoy implementando la solución del mismo, sólo quiero volver a caer en un archivo local que se genera por un origen de datos.

Mis razones para esto es que quiero tener alguna pieza de la mente cuando se trata de mantener un seguimiento de lo que me carga de Google vs lo que tengo en el servidor local. Si quiero cambiar de versiones, yo te quiero mantener mi copia local sincronizado con lo que estoy tratando de carga de Google. En un entorno donde hay muchos desarrolladores, creo que el mejor enfoque sería para automatizar este proceso para que todo lo que uno tendría que hacer es cambiar un número de versión de un archivo de configuración.

Aquí está mi propuesta de solución que debería funcionar en la teoría:

  • En un archivo de configuración de aplicación, voy a la tienda 3 cosas: dirección url absoluta de la biblioteca, la dirección url de la api de js, y el número de versión
  • Escribir una clase que obtiene el contenido del archivo de la biblioteca (se pone la url de la aplicación de configuración), se almacena en mi origen de datos con el nombre y número de versión
  • Escribir un controlador que tira de mi local en el archivo de la base de datos y se almacena en caché el archivo hasta el número de versión los cambios.
  • Si se hace el cambio (en mi aplicación de configuración), mi clase se tire el contenido del archivo basado en el número de versión, guardarlo como un nuevo registro en mi origen de datos, a continuación, el controlador tendrá una patada y a las que sirven hasta la nueva versión.

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 de mi aplicación de configuración, a continuación, la viola! Usted tiene una solución de reserva que está automatizado, y usted no tiene que mantener archivos físicos en el servidor.

Lo que hace pensar en todo el mundo? Tal vez esto es una exageración, pero podría ser un elegante método de mantenimiento de sus bibliotecas de ajax.

Bellota

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: