¿Se puede simplificar esto para cargar múltiples scripts en orden?

Lo siguiente funciona, pero necesito distribuirlo a los clientes que pueden sentirse incómodos al pegar todo este script en su página de inicio. Solo me pregunto si se puede simplificar. Necesito cargar Jquery 1.71, luego la interfaz de usuario y luego mi propio script y luego llamar a la función en mi propio script. Incluso minimizado es bastante largo.

Espero que algún gurú de javascript pueda ayudar. ¡Gracias!

var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js';
script.type = 'text/javascript';
head.appendChild(script);
if (script.onreadystatechange) script.onreadystatechange = function () {
    if (script.readyState == "complete" || script.readyState == "loaded") {
        script.onreadystatechange = false;
        //alert("complete");
        load_script();
    }
} else {
    script.onload = function () {
        //alert("complete");
        load_script();
    }
}
//setup array of scripts and an index to keep track of where we are in the process
var scripts = ['script/jquery-ui-1.8.7.custom.min.js', 'script/wfo171.js'],
    index = 0;
//setup a function that loads a single script
function load_script() {
    //make sure the current index is still a part of the array
    if (index < scripts.length) {
        //get the script at the current index
        $.getScript('http://mydomainn.com/script/' + scripts[index], function () {
            //once the script is loaded, increase the index and attempt to load the next script
            //alert('Loaded: ' + scripts[index] + "," + index);
            if (index != 0) {
                LoadEdge();
            }
            index++;
            load_script();
        });
    }
}

function LoadEdge() {
    Edge('f08430fa2a');
}

preguntado el 22 de mayo de 12 a las 15:05

2 Respuestas

Tan pronto como tenga jQuery, puede usar su poder:

$.when.apply($, $.map(scripts, $.getScript)).then(LoadEdge);

Esto se basa en su funcionalidad diferida: cada URL se reemplaza con un getScript diferido (esto obtendrá el script), y estos diferidos luego se pasan a $.when para que pueda agregar una devolución de llamada usando .then para ser llamado cuando todos los scripts hayan terminado de cargarse.

contestado el 22 de mayo de 12 a las 15:05

interesante. ¿Significa esto que jquery modifica el prototipo de la matriz y agrega el mapa? pensé que estaban en contra de modificar objetos nativos - mkoryak

@mkoryak: No, .map es nativo también. También puedes usar $.map para navegadores heredados que no tienen esta función en matrices, modificaré mi respuesta. - pimvdb

@pimvdb Voy a probar esto, como la simplicidad. un momento por favor. - Robar

¿Por qué no usa un evento de carga para asegurarse de que todo esté cargado antes de intentar ejecutarlo?

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="http://mydomainn.com/script/jquery-ui-1.8.7.custom.min.js"></script>
<script src="http://mydomainn.com/script/wfo171.js"></script>
<script>
    $(function() { // this executes when the page is ready
        Edge('f08430fa2a');
    });
</script>

(verifique las rutas en los scripts, parece que está cargando desde /script/script, no estaba seguro de si eso era correcto, así que lo eliminé.

contestado el 22 de mayo de 12 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.