Tengo un botón que establece window.location en un archivo php que genera un feed que luego se descarga. Sin embargo, como los archivos varían en tamaño debido a los datos que se colocan en el feed, a veces puede llevar un tiempo desde el clic del botón hasta el cuadro de diálogo emergente.

Lo que me gustaría poder hacer es hacer clic en el botón y mostrar loading.gif hasta que se complete el cuadro de diálogo / archivo.

¡Cualquier idea sería genial!

Salud

2
Joel 9 sep. 2009 a las 18:25

7 respuestas

La mejor respuesta

Simplemente haga que el script de generación de RSS muestre la imagen que desea (HTML de la imagen de salida, luego vacíe el búfer de salida y comience la generación de datos). Al final de la generación de datos, haga lo siguiente:

<?php
print '<script>window.location = "http://www.newlocation.com"</script>'

Eso es todo.

0
Vladislav Rastrusny 18 sep. 2009 a las 07:37

¿Es posible que use un iframe para cargar el feed y luego verifique el estado listo del iframe / documento usando un intervalo? Entonces el proceso sería:

  • Cargue una ventana que contenga un iframe de ancho y alto 100% y un loading.gif sobre el iframe.
  • Establezca un temporizador que verifique la propiedad iframe.contentWindow.document.readyState
  • Una vez que readyState == complete, muestre el diálogo de guardar archivo.

Una desventaja es que, para la mayoría de los navegadores, el archivo PHP debería estar en el mismo dominio (en IE, simplemente puede verificar la propiedad readyState del iframe).

0
Andy E 15 sep. 2009 a las 08:57

Tendrá que usar AJAX para comunicarse con el servidor y descubrir el tamaño exacto del archivo que está descargando. Entonces tienes algo para probar. No hay forma de saber el tamaño de la carga útil esperada solo desde el lado del cliente.

0
austin cheneyaustin cheney 12 sep. 2009 a las 12:00

Un método que he usado en el pasado funciona así ...

  • Establezca window.location en una página de carga y pase la página de destino en la cadena de consulta. La página de carga debe mostrar un gif animado o lo que prefiera para demostrar que se está procesando. La página de carga debe redirigirse INMEDIATAMENTE a la página de destino pasada en la cadena de consulta (junto con cualquier otro parámetro de cadena de consulta aplicable).

EDITAR: la página de carga debe redirigirse a la página de destino mediante javascript (establezca window.location en la URL proporcionada en la cadena de consulta). Este es un punto importante, porque si redirige en el lado del servidor, la página de carga no se mostrará.

EDITAR 2: si su página de carga es un archivo php, puede verificar el tamaño del archivo que se va a descargar y mostrar un tiempo estimado de descarga al usuario (junto con un gif animado de "carga"), o cualquier otra cosa.

  • La página de destino debe procesarse con el almacenamiento en búfer habilitado (llame a ob_start () antes de procesar cualquier contenido). Con el almacenamiento en búfer habilitado, no se envía nada al navegador hasta que se procese la página completa. Mientras tanto, su página de carga del paso 1 continuará mostrándose.
1
Bob Black 17 sep. 2009 a las 14:26

Es de la vieja escuela, pero esto se puede hacer muy fácilmente con el servidor push

<?php
  $separator = "end_of_section_marker";
  header('Content-type: multipart/x-mixed-replace;boundary=$separator');
  print "\n--$separator\n";
  print "Content-type: text/html\n\n";
  // Send placeholder message here
  print "--$separator\n";
  ob_flush();
  flush();
  // Start long processing here
  print "Content-type: text/html\n\n";
  // send data here
  print "--$separator--\n";
?>

Simplemente ajuste los tipos de contenido para los datos que envía. $ separator puede ser cualquier valor siempre que no aparezca en los datos que se envían.

1
Devon_C_Miller 15 sep. 2009 a las 18:09

Antes de configurar window.location, puede mostrar un div oculto con su gif

1
CodeMonkey1313 9 sep. 2009 a las 14:32

No estoy realmente seguro de por qué necesita verificar el tamaño del archivo. Si usa ajax para hacer dinámicamente el get / post, y todo lo que está haciendo es intentar mostrar un ícono de carga mientras esto sucede, es bastante simple arrojar un indicador de actividad asincrónico. Por ejemplo, con jquery:

$("#loading").ajaxStart(function(){
   $(this).show();
});

$("#loading").ajaxStop(function(){
   $(this).hide();
});

$("#feeds").load("feeds.php?id=89734258972347895");

El código anterior establece un objeto DOM con ID "cargando" para mostrar y ocultar cuando cualquier solicitud asincrónica se ha iniciado y detenido. .load (url) carga el contenido de la url en el div #feeds. Si está configurando la disposición de contenido: encabezado de archivo adjunto con php, iniciará automáticamente una ventana de descarga de archivos, aunque se haya cargado de forma asíncrona en un div. Esto también es posible sin jquery, por supuesto, solo hay un montón de compatibilidad de navegador javascript y no es tan fácil como suscribirse a los eventos ajaxStart y ajaxStop para mostrar y ocultar su img de carga.

Josh

5
Josh 15 sep. 2009 a las 14:59