2009-12-08 13 views
8

Necesito agregar un prototipo y luego agregar scriptaculous y obtener una devolución de llamada cuando ambos terminen de cargar. Actualmente Estoy cargando prototipo de este modo:document.createElement ('script') ... agregar dos scripts con una devolución de llamada

var script = document.createElement("script"); 
script.src = "http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js"; 
script.onload = script.onreadystatechange = callback; 
document.body.appendChild(script); 

que podía hacer esto por el encadenamiento de las devoluciones de llamada, pero que parece como una mala práctica (no quiero una cadena tonta de 20 métodos de devolución de llamada cuando tenga que cargar más guiones) Ideas?

+0

¿Por qué no agrega esas secuencias de comandos a un HTML si lo carga con JavaScript? – RaYell

+2

Estoy haciendo un poco de código para pegarlo en el html de otras personas para incrustar mis cosas. Solo quiero un div vacío y una referencia a mi archivo javascript para pegarlo. – user199085

+0

@kdiegert: esta referencia a su archivo js pegado: ¿quiere decir a través de ''? –

Respuesta

33

Te sugiero que uses un pequeño cargador que encadena y hace cosas por ti. Por ejemplo como éste:

function loadScripts(array,callback){ 
    var loader = function(src,handler){ 
     var script = document.createElement("script"); 
     script.src = src; 
     script.onload = script.onreadystatechange = function(){ 
      script.onreadystatechange = script.onload = null; 
      handler(); 
     } 
     var head = document.getElementsByTagName("head")[0]; 
     (head || document.body).appendChild(script); 
    }; 
    (function run(){ 
     if(array.length!=0){ 
      loader(array.shift(), run); 
     }else{ 
      callback && callback(); 
     } 
    })(); 
} 

Este script le ayudará a construir las etiquetas script y llame a su devolución de llamada cuando se han cargado todos los archivos. Invocar es bastante fácil:

loadScripts([ 
    "http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js", 
    "http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js" 
],function(){ 
    alert('All things are loaded'); 
}); 

la esperanza que esto ayudará

+0

Bingo. Muchas gracias. – user199085

+0

aysnc.parallel o async.series pueden ayudar con esto https://github.com/caolan/async –

+0

'arguments.callee' arroja un error en el modo estricto: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode "' arguments.callee' ya no es compatible. En el código normal 'arguments.callee' se refiere a la función adjunta. Este caso de uso es débil: ¡simplemente nombra la función adjunta! arguments.callee' dificulta considerablemente las optimizaciones, como las funciones en línea, porque debe ser posible proporcionar una referencia a la función no en línea si se accede a arguments.callee. –

1

Desde scriptaculous requiere prototipo, que tendrá que encadenar a los oyentes, con el método que utiliza para cargar estos scripts.

Hay varios cargadores de scripts disponibles para cargar scripts en paralelo, lo más rápido posible, p. Ej. LABjs, pero ninguno va a ayudar mucho en este escenario.

Si terminas teniendo 10-20 scripts para cargar, recomiendo combinar los scripts de antemano, usando una herramienta como Combiner.

+0

en realidad, este escenario es * exactamente * lo que LABjs era diseñado para resolver –

2

Debido a un error en Internet Explorer, el programa de cargador recursivo de nemisj no funciona correctamente en IE. Puede ser resuelto mediante el establecimiento de un retraso en la llamada recursiva como:


function loadScripts(array,callback){ 
    var loader = function(src,handler){ 
     var script = document.createElement("script"); 
     script.src = src; 
     script.onload = script.onreadystatechange = function(){ 
      script.onreadystatechange = script.onload = null; 
      if(/MSIE ([6-9]+\.\d+);/.test(navigator.userAgent))window.setTimeout(function(){handler();},8,this); else handler(); 
     } 
     var head = document.getElementsByTagName("head")[0]; 
     (head || document.body).appendChild(script); 
    }; 
    (function(){ 
     if(array.length!=0){ 
       loader(array.shift(),arguments.callee); 
     }else{ 
       callback && callback(); 
     } 
    })(); 
} 

Este pequeño truco lo hace, y con frecuencia es la solución en el IE, cuando se produce un problema inexplicable, que es demasiado a menudo.

Cuestiones relacionadas