2011-03-03 8 views
8

Estoy trabajando en un do-dad que se puede incrustar en una página como un video de youtube. El efecto particular que quiero necesita jQuery para funcionar.Cómo determinar si jQuery se está ejecutando en una página (incluso si jQuery es/después de/el script de detección)

Quiero cargar jQuery con la condición de que algo en la página no haya agregado aún jQuery.

I, aunque las pruebas de

if (typeof($)=='function'){... 

pero que sólo funciona si se carga jQuery & corriendo por la vez que la página se pone a mi guión. Dado que las mejores prácticas en estos días es incrustar secuencias de comandos en el pie de página, mi código de inserción probablemente nunca verá jQuery la mayor parte del tiempo.

Pensé en hacer la prueba onready en lugar de onload, pero la función onready está dentro de jQuery. (¿Supongo que podría usar un script independiente? ¿Hay uno bueno?)

Por último, pensé en probar jQuery después de un retraso en el tiempo de espera, pero esto parece poco elegante en el mejor de los casos y poco confiable en el peor.

¿Alguna idea?

+1

* "' Si (typeof ($) == 'objeto') {.. .' "* Eso no debería funcionar en absoluto. El 'typeof $' debe ser "función", no "objeto". También verificaría 'jQuery', no' $ ', en caso de que se use' noConflict'.(También tenga en cuenta que 'typeof' es un operador, no una función, no necesita paréntesis alrededor de su operando a menos que su operando sea una expresión complicada ... aunque hay poco daño en ellos.) –

+0

@ T.J. Crowder: Bueno, ¡diablos, jquery es una función! cambiando mi publicación ahora ... –

Respuesta

8

Dadas sus limitaciones, veo sólo dos opciones:

  1. Uso window.load evento:

    (function() { 
        if (window.addEventListener) { 
         // Standard 
         window.addEventListener('load', jQueryCheck, false); 
        } 
        else if (window.attachEvent) { 
         // Microsoft 
         window.attachEvent('onload', jQueryCheck); 
        } 
        function jQueryCheck() { 
         if (typeof jQuery === "undefined") { 
          // No one's loaded it; either load it or do without 
         } 
        } 
    })(); 
    

    window.load sucede muy tarde en el ciclo de carga, sin embargo, después de que todas las imágenes son y tal cargado

  2. Usa un tiempo de espera. La buena noticia es que el tiempo de espera puede ser bastante corto.

    (function() { 
        var counter = 0; 
    
        doDetect(); 
        function doDetect() { 
         if (typeof jQuery !== "undefined") { 
          // ...jQuery has been loaded 
         } 
         else if (++counter < 5) { // 5 or whatever 
          setTimeout(doDetect, 10); 
         } 
         else { 
          // Time out (and either load it or don't) 
         } 
        } 
    })(); 
    

    Tendrá que sintonizar para decidir los mejores valores para el contador y el intervalo. Pero si jQuery no está cargado ni siquiera en el primer o segundo bucle, mi suposición (no probada) es que no se va a cargar ... a menos que alguien más esté haciendo lo que estás haciendo. :-)

2

Puede usar window.onload. Esto se dispara después de domReady, por lo que jQuery seguramente estaría cargado en este punto.

Y compruebe jQuery, no $. A veces las personas usan jQuery con otras bibliotecas y usan $ para algo diferente.

Sin embargo, en mi humilde opinión, no creo que sea un gran problema si jQuery se carga dos veces.

1

He estado usando este código para hacer esto por un tiempo. También comprueba una versión mínima del jQuery (en nuestro caso, todavía estamos utilizando 1.4.2) antes de la carga:

/* Checks if JQuery is loaded... if not, load it. */ 
/* Remember to update minimum version number when updating the main jquery.min.js file. */ 

if (typeof jQuery != 'undefined') { 
    /* jQuery is already loaded... verify minimum version number of 1.4.2 and reload newer if needed */ 
    if (/1\.(0|1|2|3|4)\.(0|1)/.test(jQuery.fn.jquery) || /^1.1/.test(jQuery.fn.jquery) || /^1.2/.test(jQuery.fn.jquery)|| /^1.3/.test(jQuery.fn.jquery)) { 
     loadJQ(); 
    } 
} else { 
    loadJQ(); 
} 

/* loads jQuery if not already loaded, or if not a recent enough version */ 
function loadJQ() { 
    /* adds a link to jQuery to the head, instead of inline, so it validates */ 
    var headElement = document.getElementsByTagName("head")[0]; 
    linkElement=document.createElement("script"); 
    linkElement.src="../scripts/lib/jquery.min.js"; 
    linkElement.type="text/javascript"; 
    headElement.appendChild(linkElement); 
} 
+1

Dijo * "incluso si jQuery es/after/the detection script" *. Y luego continúa sobre eso en el texto. Es claramente una parte importante de lo que está preguntando. –

+0

Gracias ... Debo haberme perdido ese detalle. – Lelando

Cuestiones relacionadas