2010-01-07 8 views
8

Estoy usando javascript para incluir algún contenido servido desde un archivo php en otro servidor. Sin embargo, este otro servicio a veces puede ser escamoso y tomar mucho tiempo para cargarlo o no cargarlo en absoluto.¿Alguna forma de aplicar con gracia un límite de tiempo de espera al cargar un archivo externo lento a través de javascript?

¿Hay alguna manera en JS de tratar de obtener los datos externos durante x segundos antes de fallar y mostrar un mensaje "por favor intente nuevamente"?

<script type="text/javascript" src="htp://otherserver.com/myscript.php"></script> 
+0

... Además ... mi servidor no es compatible con php (o cualquier otra cosa ... es una tienda de Yahoo) y está en un dominio diferente que el servidor remoto que estoy sacando de –

+1

No creo que haya una forma de hacer esto además de hacer que usted ponga ese javascript en particular tan bajo en la página como sea posible, por lo que el resto de la página se carga mientras espera. –

Respuesta

2

problemas de la pareja: se puede utilizar umbrales de tiempo de espera con XMLHttpRequest (también conocido como Ajax), pero ya que está en una otherserver.com no se puede utilizar XMLHttpRequest (y apoyar a todos los navegadores de categoría A) debido a la Same Origin Policy restriction.

Si el guión introduce ningún tipo de nombre global (por ejemplo, cualquier nombre de variable, nombre de la función, etc) Usted puede tratar setTimeout para mantener la comprobación de que:

var TIMELIMIT = 5; // seconds until timeout 
var start = new Date; 

setTimeout(function() { 
    // check for something introduced by your external script. 
    // A variable, namespace or function name here is adequate: 
    var scriptIncluded = 'otherServerVariable' in window; 

    if(!scriptIncluded) { 
    if ((new Date - start)/1000 >= TIMELIMIT) { 
     // timed out 
     alert("Please try again") 
    } 
    else { 
     // keep waiting... 
     setTimeout(arguments.callee, 100) 
    } 
    } 
}, 100) 

El problema que veo es que no se puede cancelar la solicitud de la secuencia de comandos. Por favor, que alguien me corrija si me equivoco, pero eliminar el <script> del DOM aún dejará activa la solicitud del navegador para el recurso. Entonces, aunque puede detectar que la secuencia de comandos tarda más de x segundos en cargarse, no puede cancelar la solicitud.

Creo que puede estar de suerte.

-1

creo que la única manera de hacerlo es tomar el contenido del archivo a través de Ajax y luego ponga un temporizador. Si la solicitud finaliza antes del temporizador, puede evaluar la respuesta con eval (esa no es la mejor solución), de lo contrario, puede detener la solicitud de Ajax y escribir el mensaje de error.

+1

No se puede usar AJAX. El script está en un dominio diferente. – JPot

2

La única manera que puedo pensar en hacer esto es crear un proxy en otro servidor (con PHP) para que se capturen los datos para usted, pero se detendrá cuando se haya alcanzado un cierto límite de tiempo de espera (y se solo puede devolver un resultado vacío).

0

Esto es puramente, puramente teórico:

<script> etiquetas pueden insertarse dinámicamente en el DOM, en cuyo punto el guión se encontraron y procesada. Esta inyección dinámica de etiquetas de script es la forma en que algunos logran el dominio cruzado "AJAX".

Me imagino que podría declarar una variable global var hasLoaded = false;. Al final del script que está intentando cargar, puede establecer esa variable en true hadLoaded=true;. Después de inyectar la etiqueta de secuencia de comandos en el DOM, podría iniciar un setTimeout() cuya función de devolución de llamada comprueba si "hasLoaded" está establecido en verdadero. Si no es así, puede suponer que el script aún no se ha cargado completamente en el navegador. Si es así, puedes asumir que se ha cargado por completo.

Una vez más, esto es teórico, pero si lo prueba, asegúrese de informar, soy muy curioso.

+0

Además, me pregunto si la eliminación de la etiqueta del script del DOM "cancela" la solicitud.Probablemente no, creo, pero otro experimento para probar. –

+0

He visto esto hecho en la carga de la etiqueta del script en sí. Vale la pena intentarlo. – nagytech

Cuestiones relacionadas