2011-03-18 13 views
5

Tengo un archivo JavaScript de carga lenta, ¿cómo puedo ver el evento cuando la clase en el archivo está lista para su uso? Solo necesito cargar este script en un caso específico. Por lo tanto, no se carga a través de onload, sino en una cláusula if.JavaScript ¿cómo detectar eventos cuando el script de carga lenta está listo?

El código de carga diferida Tomé desde aquí: http://friendlybit.com/js/lazy-loading-asyncronous-javascript/

if (externalClassRequired) { 
    var s = document.createElement('script'); 
    s.type = 'text/javascript'; 
    s.async = true; 
    s.src = 'http://yourdomain.com/script.js'; 
    var x = document.getElementsByTagName('script')[0] 
    x.parentNode.insertBefore(s, x); 

    // When do I know when the class named "geo" is available? 
} 

Actualización:
Lo siento chicos, me olvidó totalmente sobre Ajax! :) Estaba tan concentrado en mi problema que no vi la solución obviamente por @Tokimon. La solución más simple a través de jQuery sería:

$.getScript('http://yourdomain.com/script.js', function() { 
    // callback or use the class directly 
}); 

Respuesta

1

o usted podría conseguir la escritura a través de AJAX. Entonces usted está seguro de que el script se carga cuando se dispara el evento de éxito ajax :)

+0

¿Has olvidado de Ajax! ¡Gracias! – powtac

1

Como requiere una solicitud de HTTP, debería poder poner un evento de carga sobre ella.

s.onload = function() { 
    // do something 
} 

En 'aún más rápido Sitios Web' Steve Souders ofrecen una solución, que se puede ver here.

1
var onloadCallback = function() { 
    alert('onload'); 
} 

var s = document.createElement('script'); 
s.type = 'text/javascript'; 
s.async = true; 
s.onreadystatechange = function() { // for IE 
    if (this.readyState == 'complete') onloadCallback(); 
}; 
s.onload = onloadCallback; // for other browsers 
s.src = 'http://yourdomain.com/script.js'; 
var x = document.getElementsByTagName('script')[0] 
x.parentNode.insertBefore(s, x); 

También es posible usar un XMLHttpRequest para cargar el archivo.

+1

Opera disparará la devolución de llamada dos veces. – jasssonpet

3
if (s.readyState) s.onreadystatechange = function() { 
    if (s.readyState === "loaded" || s.readyState === "complete") { 
     s.onreadystatechange = null; 
     callback(); 
    } 
}; else s.onload = function() { 
    callback(); 
}; 
+0

Ok, eso significa "cargado" (HTTP = 200) la clase en el archivo está lista para su uso? – powtac

+0

@powtac Sí, significa descargado y analizado. El punto y coma está ahí por una razón. – jasssonpet

Cuestiones relacionadas