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.