2009-10-28 10 views
5

Me gustaría incluir en la librería jquery de mi javscript include.Forma estándar de incluir javascript library desde javascript

¿Funciona esto el 100% del tiempo? ¿Hay una mejor manera?

(function() { 

var loadJquery = function (cb) { 
    var addLibs = function() { 
     if (typeof(document.body) == "undefined" || document.body === null) { 
      setTimeout(addLibs, 100); 
      return; 
     } 

     var node = document.createElement("script"); 
     node.src = "http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"; 
     document.body.appendChild(node); 
     checkLib(); 
    }; 

    var checkLib = function() { 
     if (typeof($) == "undefined" || $("*") === null) { 
      setTimeout(checkLib, 100); 
      return; 
     } 
     cb($.noConflict()); 
    } 
    addLibs(); 
} 

loadJquery(function($){ 
    // Do stuff with $ 
    $(document.body).css("background", "black"); 
}); 

})(); 

Cambiar el node.src y $.noConflict a YUI si quieres YUI3, o si usted es YAHOO YUI2, etc.

Respuesta

2

Desde la publicación en nuestra lista de contactos internos en el trabajo, me señaló a este:

Hay muchos casos límite entre navegadores que participan en forma dinámica guiones inyectables. Si enrollar el archivo semilla YUI 3 en su secuencia de comandos no es una opción y si no puede depender de la propiedad para tener la semilla YUI 3 cargada, le recomiendo usar LazyLoad (plug desvergonzado) a bootstrap su guión: http://github.com/rgrove/lazyload/

puede combinar lazyload.js en la secuencia de comandos, a continuación, utilizar algo como esto para cargar la semilla YUI 3 si no está ya en la página:

(function() { 
    function init() { 
    YUI().use('node', function (Y) { 
     // ... do my stuff ... 
    }); 
    } 

    if (YUI) { 
    init(); 
    } else { 
    LazyLoad.js('http://yui.yahooapis.com/3.0.0/build/yui/yui-min.js', 
init); 
    } 
})(); 
4

Sólo hay un problema que ocurre con este enfoque (y esto ha llegado dos veces en preguntas sobre SO en el último mes).

La cuestión es que jQuery partir de 1.3.2 no puede detectar si el documento está cargado si él mismo es incluido después de que el documento haya cargado (es decir, dinámica <script> inclusión como que está haciendo, bookmarklet, etc) en no - Navegadores IE. En tales casos, nunca se llamará a la función pasada a .ready().

Aquí está el informe de error para el problema: http://dev.jquery.com/ticket/4196 No ha pasado nada con eso en los últimos 8 meses.

Ahora, la forma en que ha diseñado loadJquery, como yo veo, debería reemplazar efectivamente a $(document).ready(), por lo que es posible que no tenga que preocuparse. Pero cualquier código que esté escrito en el estilo de paso de función $(document).ready() no se ejecutará.

+0

Eh, eso es realmente bueno saberlo. Estaba teniendo este problema un tiempo atrás y no tenía idea de por qué estaba sucediendo. –

+0

En lugar de confiar en jQuery para detectar que está cargado, ¿no puede incluir su propia etiqueta

Cuestiones relacionadas