Domanda

Ho un pulsante che imposta window.location su un file php che genera un feed che viene quindi scaricato. Tuttavia, poiché le dimensioni dei file variano a causa dei dati inseriti nel feed, a volte può essere necessario un po 'di tempo dal clic del pulsante alla finestra di dialogo del file che appare.

Quello che vorrei poter fare è fare clic sul pulsante e visualizzare un caricamento.gif fino al completamento della finestra di dialogo / file.

Qualsiasi idea sarebbe fantastica!

Saluti

È stato utile?

Soluzione

Basta fare in modo che lo script di generazione RSS mostri l'immagine desiderata (output dell'HTML dell'immagine, quindi svuotare il buffer di output e avviare la generazione dei dati). Alla fine della generazione dei dati fare:

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

Questo è tutto.

Altri suggerimenti

Non sono davvero sicuro del motivo per cui è necessario controllare la dimensione del file? Se usi ajax per eseguire in modo dinamico get / post e tutto ciò che stai facendo è provare a mostrare un'icona di caricamento mentre ciò accade, è abbastanza semplice lanciare un indicatore di attività asincrono. Ad esempio, con jquery:

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

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

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

Il codice precedente imposta un oggetto DOM con ID "caricamento in corso" per mostrare e nascondere quando una richiesta asincrona è stata avviata e arrestata. .load (url) carica il contenuto dell'url in div #feeds. Se stai impostando il content-disposition: header header con php, avvierà automaticamente una finestra di download del file, anche se è stato caricato in modo asincrono in un div. Questo è anche possibile senza jquery, ovviamente, c'è solo un sacco di javascript di compatibilità del browser e non è così semplice come semplicemente iscriversi agli eventi ajaxStart e ajaxStop per mostrare e nascondere il tuo img di caricamento.

Josh

prima di impostare window.location potresti visualizzare un div nascosto con la tua gif

È vecchia scuola, ma questo può essere fatto molto facilmente con il push del server

<?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";
?>

Regola semplicemente i tipi di contenuto per i dati che stai inviando. $ separator può avere qualsiasi valore purché non appaia nei dati inviati.

Un metodo che ho usato in passato funziona in questo modo ...

  • Imposta window.location su una pagina di caricamento e passa la pagina di destinazione nella stringa di query. La pagina di caricamento dovrebbe mostrare una gif animata o qualunque cosa tu preferisca dimostrare che l'elaborazione è in corso. La pagina di caricamento dovrebbe reindirizzare IMMEDIATAMENTE alla pagina di destinazione passata nella stringa di query (insieme a tutti gli altri parametri di query di stringa applicabili).

EDIT: la pagina di caricamento dovrebbe reindirizzare alla pagina di destinazione usando javascript (impostare window.location sull'URL fornito nella stringa di query). Questo è un punto importante, perché se reindirizzi sul lato server la pagina di caricamento non verrà visualizzata.

MODIFICA 2: se la tua pagina di caricamento è un file php, puoi controllare le dimensioni del file da scaricare e visualizzare un tempo di download stimato per l'utente (insieme a un "caricamento " gif" animato) o quant'altro.

  • Il rendering della pagina di destinazione deve essere abilitato al buffering (chiamare ob_start () prima di eseguire il rendering di qualsiasi contenuto). Con il buffering abilitato, nulla viene inviato al browser fino al rendering dell'intera pagina. Nel frattempo la pagina di caricamento dal passaggio 1 continuerà a essere visualizzata.

Dovrai utilizzare AJAX per comunicare con il server per scoprire la dimensione esatta del file che stai scaricando. Quindi hai qualcosa su cui testare. Non è possibile conoscere la dimensione del payload previsto solo dal lato client.

È possibile utilizzare un iframe per caricare il feed e quindi controllare il readyState dell'iframe / documento utilizzando un intervallo? Quindi il processo sarebbe:

  • Carica una finestra contenente un iframe di larghezza e altezza 100% e un caricamento.gif sopra l'iframe.
  • Imposta un timer che controlla la proprietà iframe.contentWindow.document.readyState
  • Una volta completato readyState ==, mostra la finestra di dialogo di salvataggio del file.

Uno svantaggio è che, per la maggior parte dei browser, il file PHP dovrebbe trovarsi nello stesso dominio (su IE puoi semplicemente controllare la proprietà readyState dell'iframe).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top