Come faccio ad attivare un evento quando un iframe ha terminato il caricamento in jQuery?


95

Devo caricare un PDF all'interno di una pagina.

Idealmente vorrei avere una GIF animata in caricamento che viene sostituita una volta che il PDF è stato caricato.

Risposte:


38

Sono abbastanza certo che non possa essere fatto.

Praticamente qualsiasi altra cosa oltre al PDF funziona, anche Flash. (Testato su Safari, Firefox 3, IE 7)

Peccato.


FWIW, tutti loro (anche PDF) hanno funzionato per me con Chrome su OS X.
pkaeding

Sì, funziona in Chrome ma non in IE. Se l'applicazione è sul Web, deve funzionare anche in IE.
Robert Smith

214

Hai provato:

$("#iFrameId").on("load", function () {
    // do something once the iframe is loaded
});

19
+1 perché mentre questo non sembra funzionare per il caricamento del PDF nell'iframe, è utile per altri tipi di contenuto.
Cory House

3
+1 Non esattamente quello che il richiedente originale voleva sapere (in relazione al pdf), ma questa risposta corrisponde alla domanda "Come faccio ad attivare un evento quando un iframe ha terminato il caricamento in jQuery?" . Grazie
Harvey Darvey

Non l'ho provato con i PDF, ma funzionerà perfettamente per gli URL normali.
Bob-ob

Lo sto usando all'interno in $(function({})modo che il telaio venga caricato per primo. Ma non sto ottenendo il risultato sperato. Chrome 25 Mac
William Entriken

Questo non funziona per il caricamento del pdf nell'iframe. Testato in IE 11.
Robert Smith

7

Questo lo ha fatto per me (non pdf, ma un altro onloadcontenuto " resistente"):

<iframe id="frameid" src="page.aspx"></iframe>
<script language="javascript">
    iframe = document.getElementById("frameid");

    WaitForIFrame();

    function WaitForIFrame() {
        if (iframe.readyState != "complete") {
            setTimeout("WaitForIFrame();", 200);
        } else {
            done();
        }
    }

    function done() {
        //some code after iframe has been loaded
    }
</script>  

Spero che questo ti aiuti.


7
L'argomento stringa setTimeout () dovrebbe essere evitato:setTimeout(WaitForIFrame, 200);
Stefan Majewsky

7

Lo sto provando e sembra funzionare per me: http://jsfiddle.net/aamir/BXe8C/

File pdf più grande: http://jsfiddle.net/aamir/BXe8C/1/


1
Non molto diverso dalla risposta di @travis ma farò +1 a causa dell'elegante utilizzo di attr src change e css. Vedo almeno qualcuno che finge un bel caricatore in quel modo.
Anthony Hatzopoulos

L'evento di caricamento è stato generato prima del completo caricamento del PDF.
Etlds

Loading PDF...Ho provato i tuoi collegamenti su OSX con l'ultimo Chrome e al caricamento della prima pagina, non ha funzionato, mantenuto ma quando ho aggiornato la pagina, ha detto PDF Loaded!. Ma questo sembra funzionare con gli URL :) quindi è molto utile per me. Grazie!
GabLeRoux

Questo non funziona se il file è impostato per il download, invece di essere visualizzato nell'iframe.
Suona

Questo non funziona in IE 11. Mantiene "Caricamento PDF in corso ...". Sto cercando una soluzione che funzioni anche in IE 11.
Marc

6
$("#iFrameId").ready(function (){
    // do something once the iframe is loaded
});

hai provato .ready invece?


Questo metodo non funzionerà come previsto. Dalla documentazione di JQuery: "Il metodo .ready () può essere chiamato solo su un oggetto jQuery che corrisponde al documento corrente, quindi il selettore può essere omesso." Sembra che verrà attivato dopo $ (documento) indipendentemente dal selettore utilizzato.
Cazuma Nii Cavalcanti

Sono abbastanza certo che questa sia una teoria inattiva.
Barney

Ripeti la risposta precedente!
SyntaxRules

Come altri hanno affermato, l'ho testato e non ha funzionato. Il Ready è stato chiamato sul documento pronto, non l'iframe ... Usa l'opzione On Load.
Greg

5

Ho provato un approccio fuori dagli schemi a questo, non l'ho testato per il contenuto PDF ma ha funzionato per il normale contenuto basato su HTML, ecco come:

Passaggio 1 : avvolgi il tuo Iframe in un wrapper div

Passaggio 2 : aggiungi un'immagine di sfondo al tuo div wrapper:

.wrapperdiv{
  background-image:url(img/loading.gif);
  background-repeat:no-repeat;
  background-position:center center; /*Can place your loader where ever you like */
}

Passaggio 3 : nel tuo tag iframe aggiungi ALLOWTRANSPARENCY="false"

L'idea è di mostrare l'animazione di caricamento nel div wrapper fino a quando l'iframe non viene caricato dopo aver caricato l'iframe coprirà l'animazione di caricamento.

Provaci.


4

Utilizzando sia jquery Load che Ready, nessuno dei due sembrava corrispondere realmente quando l'iframe era VERAMENTE pronto.

Ho finito per fare qualcosa del genere

$('#iframe').ready(function () {
    $("#loader").fadeOut(2500, function (sender) {
        $(sender).remove();
    });
});

Dove #loader è un div posizionato in modo assoluto sopra l'iframe con una gif di selezione.


2

@Alex aw che è un peccato. E se nel tuo iframeavessi un documento html che assomiglia a:

<html>
  <head>
    <meta http-equiv="refresh" content="0;url=/pdfs/somepdf.pdf" />
  </head>
  <body>
  </body>
</html>

Sicuramente un hack, ma potrebbe funzionare per Firefox. Anche se mi chiedo se l'evento di caricamento si attiverà troppo presto in quel caso.


questo è quello che sto cercando :(
Aamir Afridi

1

Ho dovuto mostrare un caricatore durante il caricamento del pdf in iFrame, quindi cosa mi viene in mente:

    loader({href:'loader.gif', onComplete: function(){
            $('#pd').html('<iframe onLoad="loader.close();" src="pdf" width="720px" height="600px" >Please wait... your report is loading..</iframe>');
    }
    });

Sto mostrando un caricatore. Una volta che sono sicuro che il cliente può vedere il mio loader, sto chiamando il metodo onCompllet loaders che carica un iframe. Iframe ha un evento "onLoad". Una volta caricato il PDF, si attiva l'evento onloat in cui sto nascondendo il caricatore :)

La parte importante:

iFrame ha un evento "onLoad" in cui puoi fare ciò di cui hai bisogno (nascondi caricatori ecc.)


0

Ecco cosa faccio per qualsiasi azione e funziona in Firefox, IE, Opera e Safari.

<script type="text/javascript">
  $(document).ready(function(){
    doMethod();
  });
  function actionIframe(iframe)
  {
    ... do what ever ...
  }
  function doMethod()
  {   
    var iFrames = document.getElementsByTagName('iframe');

    // what ever action you want.
    function iAction()
    {
      // Iterate through all iframes in the page.
      for (var i = 0, j = iFrames.length; i < j; i++)
      {
        actionIframe(iFrames[i]);
      }
    }

    // Check if browser is Safari or Opera.
    if ($.browser.safari || $.browser.opera)
    {
      // Start timer when loaded.
      $('iframe').load(function()
      {
        setTimeout(iAction, 0);
      }
      );

      // Safari and Opera need something to force a load.
      for (var i = 0, j = iFrames.length; i < j; i++)
      {
         var iSource = iFrames[i].src;
         iFrames[i].src = '';
         iFrames[i].src = iSource;
      }
    }
    else
    {
      // For other good browsers.
      $('iframe').load(function()
      {
        actionIframe(this);
      }
      );
    }
  }
</script>

0

Se puoi aspettarti che l'interfaccia di apertura / salvataggio del browser venga visualizzata per l'utente una volta completato il download, puoi eseguirla all'avvio del download:

$( document ).blur( function () {
    // Your code here...
});

Quando il dialogo si apre nella parte superiore della pagina, si attiverà l'evento sfocatura.


0

Poiché dopo che il file pdf è stato caricato, il documento iframe avrà un nuovo elemento DOM <embed/>, quindi possiamo fare il controllo in questo modo:

    window.onload = function () {


    //creating an iframe element
    var ifr = document.createElement('iframe');
    document.body.appendChild(ifr);

    // making the iframe fill the viewport
    ifr.width  = '100%';
    ifr.height = window.innerHeight;

    // continuously checking to see if the pdf file has been loaded
     self.interval = setInterval(function () {
        if (ifr && ifr.contentDocument && ifr.contentDocument.readyState === 'complete' && ifr.contentDocument.embeds && ifr.contentDocument.embeds.length > 0) {
            clearInterval(self.interval);

            console.log("loaded");
            //You can do print here: ifr.contentWindow.print();
        }
    }, 100); 

    ifr.src = src;
}

0

La soluzione che ho applicato a questa situazione è semplicemente posizionare un'immagine di caricamento assoluta nel DOM, che sarà coperta dal livello iframe dopo che l'iframe è stato caricato.

Lo z-index dell'iframe dovrebbe essere (caricamento dello z-index + 1) o semplicemente superiore.

Per esempio:

.loading-image { position: absolute; z-index: 0; }
.iframe-element { position: relative; z-index: 1; }

Spero che questo aiuti se nessuna soluzione javaScript lo ha fatto. Penso che CSS sia la migliore pratica per queste situazioni.

I migliori saluti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.