Comment déclencher un événement lorsqu'une iframe a fini de se charger dans jQuery?


95

Je dois charger un PDF dans une page.

Idéalement, j'aimerais avoir un gif animé de chargement qui est remplacé une fois le PDF chargé.

Réponses:


38

Je suis presque certain que cela ne peut pas être fait.

Presque tout autre chose que PDF fonctionne, même Flash. (Testé sur Safari, Firefox 3, IE 7)

Dommage.


FWIW, tous (même PDF) ont fonctionné pour moi avec Chrome sur OS X.
pkaeding

Oui, cela fonctionne dans Chrome mais pas dans IE. Si l'application est sur le Web, elle doit également fonctionner dans IE.
Robert Smith

214

As-tu essayé:

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

19
+1 car même si cela ne semble pas fonctionner pour le chargement du PDF dans l'iframe, c'est utile pour d'autres types de contenu.
Cory House

3
+1 Pas exactement ce que le demandeur d'origine voulait savoir (par rapport au pdf), mais cette réponse correspond à la question "Comment déclencher un événement quand un iframe a fini de se charger dans jQuery?" . Merci
Harvey Darvey

Je n'ai pas essayé cela avec les PDF, mais cela fonctionnera parfaitement pour les URL normales.
Bob-ob du

J'utilise ceci à l'intérieur $(function({})pour que le cadre se charge en premier. Mais je n'obtiens pas le résultat espéré. Chrome 25 Mac
William Entriken

Cela ne fonctionne pas pour le chargement de pdf dans l'iframe. Testé dans IE 11.
Robert Smith

7

Cela l'a fait pour moi (pas de pdf, mais un autre onloadcontenu " résistant"):

<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>  

J'espère que cela t'aides.


7
L'argument de chaîne setTimeout () doit être évité:setTimeout(WaitForIFrame, 200);
Stefan Majewsky

7

J'essaye ceci et semble fonctionner pour moi: http://jsfiddle.net/aamir/BXe8C/

Fichier pdf plus gros: http://jsfiddle.net/aamir/BXe8C/1/


1
Pas très différent de la réponse de @travis mais je vais +1 à cause de l'utilisation élégante du changement d'attr src et du css. Je peux voir quelqu'un au moins simuler un beau chargeur le faire de cette façon.
Anthony Hatzopoulos

L'événement de chargement s'est déclenché avant le chargement complet du PDF.
etlds

J'ai essayé vos liens sur OSX avec le dernier Chrome et lors du chargement de la première page, cela n'a pas fonctionné, conservé Loading PDF...mais lorsque j'ai actualisé la page, a déclaré PDF Loaded!. Mais cela semble fonctionner avec les urls :) donc c'est très utile pour moi. Merci!
GabLeRoux

Cela ne fonctionne pas si le fichier est configuré pour être téléchargé, au lieu d'être rendu dans l'iframe.
Anneau

Cela ne fonctionne pas dans IE 11. Conserve "Chargement du PDF ...". Je recherche une solution qui fonctionne également dans IE 11.
Marc

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

avez-vous essayé .ready à la place?


Cette méthode ne fonctionnera pas comme prévu. Dans la documentation JQuery: "La méthode .ready () ne peut être appelée que sur un objet jQuery correspondant au document actuel, le sélecteur peut donc être omis." On dirait qu'il sera déclenché après $ (document) quel que soit le sélecteur utilisé.
Cazuma Nii Cavalcanti

Je suis à peu près certain que c'est une théorie oiseuse.
Barney

Répétez la réponse précédente!
SyntaxRules

Comme d'autres l'ont dit, j'ai testé cela et cela n'a pas fonctionné. Le Prêt a été appelé sur le document prêt, pas sur l'iframe ... Utilisez l'option Au chargement.
Greg

5

J'ai essayé une approche prête à l'emploi, je n'ai pas testé cela pour le contenu PDF mais cela a fonctionné pour le contenu HTML normal, voici comment:

Étape 1 : enveloppez votre Iframe dans un emballage div

Étape 2 : Ajoutez une image d'arrière-plan à votre wrapper div:

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

Étape 3 : dans votre tag iframe ajouter ALLOWTRANSPARENCY="false"

L'idée est de montrer l'animation de chargement dans le div wrapper jusqu'à ce que l'iframe se charge après avoir chargé l'iframe couvrirait l'animation de chargement.

Essaie.


4

L'utilisation de jquery Load et Ready ne semblait pas vraiment correspondre lorsque l'iframe était VRAIMENT prêt.

J'ai fini par faire quelque chose comme ça

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

Où #loader est un div absolument positionné au-dessus de l'iframe avec un gif spinner.


2

@Alex aw c'est une déception. Et si dans votre iframevous aviez un document html qui ressemblait à:

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

Certainement un hack, mais cela pourrait fonctionner pour Firefox. Bien que je me demande si l'événement de chargement se déclencherait trop tôt dans ce cas.


c'est ce que je recherche :(
Aamir Afridi

1

J'ai dû montrer un chargeur pendant le chargement du pdf dans iFrame, alors ce que je propose:

    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>');
    }
    });

Je montre un chargeur. Une fois que je suis sûr que le client peut voir mon chargeur, j'appelle la méthode onCompllet loaders qui charge un iframe. Iframe a un événement "onLoad". Une fois le PDF chargé, il déclenche un événement à flot où je cache le chargeur :)

La partie importante:

iFrame a un événement "onLoad" où vous pouvez faire ce dont vous avez besoin (masquer les chargeurs, etc.)


0

Voici ce que je fais pour toute action et cela fonctionne dans Firefox, IE, Opera et 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

Si vous pouvez vous attendre à ce que l'interface d'ouverture / d'enregistrement du navigateur apparaisse pour l'utilisateur une fois le téléchargement terminé, vous pouvez l'exécuter lorsque vous démarrez le téléchargement:

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

Lorsque le dialogue apparaît en haut de la page, l'événement de flou se déclenche.


0

Puisqu'après le chargement du fichier pdf, le document iframe aura un nouvel élément DOM <embed/>, nous pouvons donc faire la vérification comme ceci:

    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 solution que j'ai appliquée à cette situation est de simplement placer une image de chargement absolu dans le DOM, qui sera couverte par la couche iframe après le chargement de l'iframe.

L'index z de l'iframe doit être (index z du chargement + 1), ou juste supérieur.

Par exemple:

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

J'espère que cela aide si aucune solution javaScript ne l'a fait. Je pense que CSS est la meilleure pratique pour ces situations.

Meilleures salutations.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.