Come visualizzare il messaggio di caricamento durante il caricamento di un iFrame?


107

Ho un iframe che carica un sito Web di terze parti che è estremamente lento da caricare.

C'è un modo per visualizzare un messaggio di caricamento mentre l'iframe carica l'utente non vede un grande spazio vuoto?

PS. Tieni presente che l'iframe è per un sito Web di terze parti, quindi non posso modificare / inserire nulla sulla loro pagina.


Sì, non sono a conoscenza di alcun richiamo di avanzamento per iframe ... Hmm.
Jeffrey Sweeney

Risposte:


232

Ho eseguito il seguente approccio CSS:

<div class="holds-the-iframe"><iframe here></iframe></div>

.holds-the-iframe {
  background:url(../images/loader.gif) center center no-repeat;
}

1
Questo ha funzionato perfettamente per i miei casi. La risposta scelta non ha funzionato per me perché stavo caricando iFrame solo quando si faceva clic su una scheda. Ma questo è visualizzato elegantemente durante il caricamento della sorgente iFrame. Ma
peccato

21
Questo non funziona bene se l'iframe che stai caricando ha uno sfondo trasparente. Puoi ancora vedere la gif in caricamento una volta caricato l'iframe!
Westy92

3
@Christna Questo trucco non funziona per IE-11. C'è qualche hack?
mmuzahid

3
Con la funzione onload iframe puoi rimuovere l'immagine di sfondo CSS.
Hugo Cox

1
Bella risposta. Funziona. È anche meglio aggiungere un po 'di altezza in modo che il caricatore sia facilmente visibile.
Raz

33

Penso che questo codice aiuterà:

JS:

$('#foo').ready(function () {
    $('#loadingMessage').css('display', 'none');
});
$('#foo').load(function () {
    $('#loadingMessage').css('display', 'none');
});

HTML:

<iframe src="http://google.com/" id="foo"></iframe>
<div id="loadingMessage">Loading...</div>

CSS:

#loadingMessage {
    width: 100%;
    height: 100%;
    z-index: 1000;
    background: #ccc;
    top: 0px;
    left: 0px;
    position: absolute;
}

Capisco perché ti nascondi #loadingMessagequando loadspara, ma perché lo nascondi anche su ready? Non è troppo presto?
giovedì

1
Dipende dalle esigenze dell'utente. Se non ha bisogno che tutte le immagini vengano caricate prima di nascondere il messaggio di caricamento, non avrà bisogno del callback al caricamento.
Minko Gechev

9
jquery non è "JS".
OZ_

5
@OZ_ non è difficile trasformare il codice sopra in javascript vanilla usando addEventListenere usando querySelector+ la styleproprietà s :-). In aggiunta a ciò, l'autore della domanda ha taggato è as jquery. Non riesci a capire perché era il tuo messaggio? :-)
Minko Gechev

17

Se stai cercando di ottenere solo un segnaposto: un approccio folle consiste nell'iniettare del testo come sfondo svg. Permette una certa flessibilità e da quello che ho letto il supporto del browser dovrebbe essere abbastanza decente (non l'ho testato però):

  • Chrome> = 27
  • FireFox> = 30
  • Internet Explorer> = 9
  • Safari> = 5.1

html:

<iframe class="iframe-placeholder" src=""></iframe>

css:

.iframe-placeholder
{
   background: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 100% 100%"><text fill="%23FF0000" x="50%" y="50%" font-family="\'Lucida Grande\', sans-serif" font-size="24" text-anchor="middle">PLACEHOLDER</text></svg>') 0px 0px no-repeat;
}

Cosa puoi cambiare?

All'interno del valore di sfondo:

  • dimensione del carattere: cerca font-size = "" e modifica il valore come preferisci

  • colore del carattere: cerca fill = "" . Non dimenticare di sostituire il # con% 23 se stai usando la notazione colore esadecimale. % 23 sta per un # nella codifica URL che è necessario affinché la stringa svg possa essere analizzata in FireFox.

  • font family: cerca font-family = "" ricorda di evitare le virgolette singole se hai un carattere composto da più parole (come con \ 'Lucida Grande \')

  • testo: cerca il valore dell'elemento di testo dove vedi la stringa SEGNAPOSTO . Puoi sostituire la stringa PLACEHOLDER con qualsiasi cosa conforme all'URL (i caratteri speciali devono essere convertiti in notazione percentuale)

Esempio sul violino

Professionisti:

  • Nessun elemento HTML aggiuntivo
  • No js
  • Il testo può essere facilmente (...) regolato senza la necessità di un programma esterno
  • È SVG, quindi puoi inserire facilmente qualsiasi SVG che desideri.

Contro:

  • Supporto del browser
  • È complesso
  • È hacky
  • Se iframe-src non ha uno sfondo impostato, il segnaposto risplenderà (il che non è inerente a questo metodo, ma solo il comportamento standard quando si utilizza un bg sull'iframe)

Lo consiglierei solo se è assolutamente necessario mostrare il testo come segnaposto in un iframe che richiede un po 'di flessibilità (più lingue, ...). Prenditi un momento e riflettici: tutto questo è davvero necessario? Se potessi scegliere, sceglierei il metodo di @ Christina


5
$('iframe').load(function(){
      $(".loading").remove();
    alert("iframe is done loading")
}).show();


<iframe src="http://www.google.com" style="display:none;" width="600" height="300"/>
<div class="loading" style="width:600px;height:300px;">iframe loading</div>

Questa non è necessariamente una buona soluzione per un iframe che viene caricato su un sito Web di terze parti, poiché potrebbero non avere jQuery sulla loro pagina.
Luca

4

Ecco una soluzione rapida per la maggior parte dei casi:

CSS:

.iframe-loading { 
    background:url(/img/loading.gif) center center no-repeat; 
}

Puoi utilizzare una GIF di caricamento animata se lo desideri,

HTML:

<div class="iframe-loading">
    <iframe src="http://your_iframe_url_goes_here"  onload="$('.iframe-loading').css('background-image', 'none');"></iframe>
</div>

Utilizzando l'evento onload puoi rimuovere l'immagine di caricamento dopo che la pagina di origine è stata caricata all'interno del tuo iframe.

Se non stai usando jQuery, inserisci semplicemente un id nel div e sostituisci questa parte di codice:

$('.iframe-loading').css('background-image', 'none');

da qualcosa di simile:

document.getElementById("myDivName").style.backgroundImage = "none";

Ti auguro il meglio!


2

Sì, puoi utilizzare un div trasparente posizionato sull'area dell'iframe, con una gif del caricatore come unico sfondo.

Quindi puoi allegare un onloadevento all'iframe:

 $(document).ready(function() {

   $("iframe#id").load(function() {
      $("#loader-id").hide();
   });
});

1

Ho seguito il seguente approccio

Innanzitutto, aggiungi div di pari livello

$('<div class="loading"></div>').insertBefore("#Iframe");

e poi quando l'iframe ha completato il caricamento

$("#Iframe").load(function(){
   $(this).siblings(".loading-fetching-content").remove(); 
  });

0
<!DOCTYPE html>
<html>
<head>
<title>jQuery Demo - IFRAME Loader</title>
<style>
#frameWrap {
    position:relative;
    height: 360px;
    width: 640px;
    border: 1px solid #777777;
    background:#f0f0f0;
    box-shadow:0px 0px 10px #777777;
}

#iframe1 {
    height: 360px;
    width: 640px;
    margin:0;
    padding:0;
    border:0;
}

#loader1 {
    position:absolute;
    left:40%;
    top:35%;
    border-radius:20px;
    padding:25px;
    border:1px solid #777777;
    background:#ffffff;
    box-shadow:0px 0px 10px #777777;
}
</style>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</head>
<body>

<div id="frameWrap">
<img id="loader1" src="loading.gif" width="36" height="36" alt="loading gif"/>
<iframe id="iframe1" src="https://bots.actcorp.in/ACTAppChat/chat?authtext=test@user8.com&authToken=69d1afc8d06fb97bdb5a9275edbc53b375c3c7662c88b78239ba0cd8a940d59e" ></iframe>
</div>
<script>
    $(document).ready(function () {
        $('#iframe1').on('load', function () {
            $('#loader1').hide();
        });
    });
</script>

</body>
</html>

-1

Puoi usare come sotto

$('#showFrame').on("load", function () {
        loader.hide();
});
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.