Pregunta

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

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

¡Cualquier idea sería genial!

Saludos

¿Fue útil?

Solución

Simplemente haga que la secuencia de comandos de generación RSS muestre la imagen que desee (haga clic en el HTML de la imagen, luego vacíe el búfer de salida y comience la generación de datos). Al final de la generación de datos haz:

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

Eso es todo.

Otros consejos

No estoy realmente seguro de por qué necesita comprobar el tamaño del archivo. Si usa ajax para hacer dinámicamente la obtención / publicación, y todo lo que está haciendo es tratar de mostrar un icono de carga mientras esto sucede, es bastante sencillo lanzar un indicador de actividad asíncrona. 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 se ha iniciado y detenido una solicitud asíncrona. .load (url) carga el contenido de la url en los div #feeds. Si está configurando el encabezado de disposición de contenido: adjunto con php, se iniciará automáticamente una ventana de descarga de archivos, aunque se haya cargado de forma asíncrona en un div. Por supuesto, esto también es posible sin jquery, hay solo un montón de javascript de compatibilidad con el navegador y no es tan fácil como simplemente suscribirse a los eventos ajaxStart y ajaxStop para mostrar y ocultar su img de carga.

Josh

antes de configurar window.location, puedes mostrar un div oculto con tu gif

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

<?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 está enviando. $ separator puede tener cualquier valor siempre y cuando no aparezca en los datos que se envían.

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 prefieras para demostrar que el procesamiento se está realizando. 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 usando javascript (establezca window.location en la URL proporcionada en la cadena de consulta). Este es un punto importante, porque si redirecciona en el lado del servidor, la página de carga no se mostrará.

EDIT 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 de descarga estimado para el usuario (junto con un " cargando " gif), o cualquier otra cosa.

  • La página de destino debe mostrarse con el búfer habilitado (llame a ob_start () antes de representar cualquier contenido). Con el búfer habilitado, no se envía nada al navegador hasta que se representa toda la página. Mientras tanto, su página de carga del paso 1 seguirá mostrándose.

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

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top