2009-12-27 12 views
6

Estoy intentando encapsular un javascript que creé usando jQuery, jQuery UI, jQuery Form y xmlDom.Cargando dinámicamente jQuery y extensiones

Deseo poder enviar a mi cliente solo un javascript que haga referencia a los otros, incluyendo solo un pequeño fragmento de js para la configuración de opciones.

encontrar más adelante un ejemplo:

<script language="javascript"> 
var myOptions = { 
    shop: 1, 
    style: "gold" 
} 
load(); 
</script> 
<script src="http://myServer/myScript.js" type="text/javascript"></script> 

Ha sido casi imposible para mí para cargar plugins jQuery y dinámicamente. Leí muchos ejemplos, jQuery funciona bien cuando lo cargo dinámicamente, pero el resto de las extensiones nunca funcionó correctamente. Después de secuencia es el único que carga al menos un par de plugins:

Establecer una función de carga que carga jQuery dinámicamente:

load = function() { 
    load.getScript(url_base + "/js/jquery-1.3.2.js"); 
    load.tryReady(0); 
} 
load.getScript = function(filename) { 
    var script = document.createElement('script') 
    script.setAttribute("type","text/javascript") 
    script.setAttribute("src", filename) 
    if (typeof script!="undefined") 
    document.getElementsByTagName("head")[0].appendChild(script) 
} 
load.tryReady = function(time_elapsed) { 
    // Continually polls to see if jQuery is loaded. 
    if (typeof $ == "undefined") { // if jQuery isn't loaded yet... 
    if (time_elapsed <= 5000) { // and we havn't given up trying... 
     setTimeout("load.tryReady(" + (time_elapsed + 200) + ")", 200); // set a timer to check again in 200 ms. 
    } else { 
     alert("Timed out while loading jQuery.") 
    } 
    } else { 
    ... 
    } 

carga todos los plugins después de eso, jQueryForm, jQuery UI, XMLDOM

Cuando compruebo para jQuery forma que esté disponible:

if (jQuery().ajaxForm) 

Cuando compruebo para XMLDOM funciona.

Cuando reviso jQuery UI nunca está disponible.

if(jQuery().ui) 

No importa si configuro un tiempo de espera para esperar la IU, nunca se carga. Parece que jQuery ejecuta las funciones de mi UI antes de que se cargue.

¿Alguien me puede enviar un enlace para ayudar con esto?

+0

Cuando ve el html, ¿la etiqueta de script ui está en la cabeza? ¿Qué sucede cuando prueba 'if (jQuery.fn.ajaxForm)'? – czarchaic

+0

Esa línea que mencionaste funciona, quiero decir, la expresión es verdadera. Necesito que todas las extensiones se carguen antes de mi script. Pude obtener una solución para IE, pero no funciona en Chrome y Firefox, que prueba esas condiciones durante un cierto período hasta que se convierte en realidad o regresa antes de tiempo. –

Respuesta

3

Como dice Zen of Python, "Simple es mejor que complejo". ¿Vale la pena todo este lío con los tiempos muertos? Como supongo, el browswer TENDRÁ que cargar todas las js-libraries de cualquier forma (para ejecutar su archivo "myScript.js"), entonces ¿no es más fácil simplemente incluirlas "normalmente"?

+0

Agradezco su comentario, pero tengo que hacerlo de otra manera. –

+0

¿Luego ha intentado hacer su función de "carga" sin tiempos de espera? Eso debería ayudar (lo he hecho y funcionó). Si no lo hace, también puede intentar mover la inclusión de su 'myScript.js' del encabezado al cuerpo del documento. –

7

Tal vez, this might help. Desde el sitio de dive.into.javascript:

SidJS es una biblioteca ligera JavaScript utilizado para cargar JavaScript scripts y hojas de estilo CSS bajo demanda. Aumenta el rendimiento de las aplicaciones AJAX al cargar recursos cuando son necesarios.

Minificado con el Google Closure Compiler, pesa 1.12KB (625 bytes con GZipped).

Si no puedes incluir otra biblioteca de JavaScript, puedes echarle un vistazo al código (realmente no hay mucho); con las ideas allí, deberías poder arreglar tu script.

EDITAR
Si se utiliza el compilador de cierre a Google minify el guión, tendrá que volver a agregar la línea node.sheet.cssRules. Parece que se usa en los navegadores Gecko y Webkit, para probar si se ha descargado por completo una hoja de estilo con carga diferida (por supuesto, si no va a cargar perezosas hojas de estilo, puede eliminar esa sección por completo).

+0

¡Esto me salvó la vida, gracias! –

+1

Cuando lo implementé por primera vez, recibí un error de 'appendChild' al intentar agregar un archivo js. Pero css funcionaría bien. La razón es porque estaba incluyendo esto en la etiqueta 'head' antes de que el' body' estuviera disponible en el DOM. Por lo tanto, debe ajustar un '$ (document) .ready();' a su alrededor para que funcione. – SammyK

Cuestiones relacionadas