Wie wird eine Lademeldung angezeigt, wenn ein iFrame geladen wird?

107

Ich habe einen Iframe, der eine Website eines Drittanbieters lädt, die extrem langsam geladen wird.

Gibt es eine Möglichkeit, eine Lademeldung anzuzeigen, während der Iframe geladen wird und der Benutzer keine große Leerstelle sieht?

PS. Beachten Sie, dass der Iframe für eine Website eines Drittanbieters bestimmt ist, sodass ich auf seiner Seite nichts ändern / einfügen kann.

Jacob
quelle
Ja, mir sind keine Fortschrittsrückrufe für Iframes bekannt ... Hmm.
Jeffrey Sweeney

Antworten:

231

Ich habe den folgenden CSS-Ansatz gemacht:

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

.holds-the-iframe {
  background:url(../images/loader.gif) center center no-repeat;
}
Christina
quelle
1
Dies funktionierte perfekt für meine Fälle. Die eine Antwort hat bei mir nicht funktioniert, da ich iFrame nur geladen habe, als auf eine Registerkarte geklickt wurde. Dieser wurde jedoch beim Laden der iFrame-Quelle elegant angezeigt. Aber schade, dass dies nicht als Antwort gewählt wurde, weil Jacob nach einer jQuery-Lösung fragte ...
dance2die
21
Dies funktioniert nicht gut, wenn der Iframe, den Sie laden, einen transparenten Hintergrund hat. Sie können das Lade-GIF immer noch sehen, sobald der Iframe geladen ist!
Westy92
3
@Christna Dieser Trick funktioniert nicht für IE-11. Gibt es einen Hack?
mmuzahid
3
Mit der iframe-Onload-Funktion können Sie das CSS-Hintergrundbild entfernen.
Hugo Cox
1
Gute Antwort. Es klappt. Sie sollten auch etwas Höhe hinzufügen, damit der Lader gut sichtbar ist.
Raz
33

Ich denke, dass dieser Code helfen wird:

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;
}
Minko Gechev
quelle
Ich verstehe, warum du dich #loadingMessagebei loadBränden versteckst , aber warum versteckst du es auch auf ready? Ist das nicht zu früh?
Dienstag,
1
Dies hängt von den Bedürfnissen des Benutzers ab. Wenn nicht alle Bilder geladen werden müssen, bevor die Lademeldung ausgeblendet wird, benötigt er keinen Rückruf beim Laden.
Minko Gechev
9
jquery ist nicht "JS".
OZ_
5
@OZ_ es ist nicht schwer , den Code oben auf Vanille Javascript zu aktivieren , indem Verwendung addEventListenerund Nutzung querySelector+ das styleEigentum :-). Darüber hinaus hat der Autor der Frage als markiert jquery. Kannst du nicht verstehen, warum deine Nachricht war? :-)
Minko Gechev
15

Wenn es nur ein Platzhalter ist, den Sie erreichen möchten: Ein verrückter Ansatz besteht darin, Text als SVG-Hintergrund einzufügen. Es ermöglicht eine gewisse Flexibilität, und nach dem, was ich gelesen habe, sollte die Browserunterstützung ziemlich anständig sein (habe sie jedoch nicht getestet):

  • 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;
}

Was kannst du ändern?

Innerhalb des Hintergrundwerts:

  • Schriftgröße: Suchen Sie nach font-size = "" und ändern Sie den Wert nach Belieben

  • Schriftfarbe: Suche nach fill = "" . Vergessen Sie nicht, das # durch% 23 zu ersetzen, wenn Sie die hexadezimale Farbnotation verwenden. % 23 steht für ein # in der URL-Codierung, das erforderlich ist, damit die SVG-Zeichenfolge in FireFox analysiert werden kann.

  • Schriftfamilie: Suchen Sie nach font-family = "" Denken Sie daran, die einfachen Anführungszeichen zu umgehen, wenn Sie eine Schrift haben, die aus mehreren Wörtern besteht (wie bei \ 'Lucida Grande \').

  • text: Suchen Sie nach dem Elementwert des Textelements, in dem Sie die PLACEHOLDER-Zeichenfolge sehen . Sie können die PLACEHOLDER-Zeichenfolge durch eine URL-konforme Zeichenfolge ersetzen (Sonderzeichen müssen in Prozentschreibweise konvertiert werden).

Beispiel für Geige

Vorteile:

  • Keine zusätzlichen HTML-Elemente
  • Nein js
  • Text kann einfach (...) ohne ein externes Programm angepasst werden
  • Es ist SVG, so dass Sie einfach jede gewünschte SVG dort einfügen können.

Nachteile:

  • Browser-Unterstützung
  • Es ist komplex
  • Es ist hacky
  • Wenn für den iframe-src kein Hintergrund festgelegt ist, leuchtet der Platzhalter durch (was dieser Methode nicht eigen ist, sondern nur das Standardverhalten, wenn Sie ein bg für den iframe verwenden).

Ich würde dies nur empfehlen, wenn es unbedingt erforderlich ist, Text als Platzhalter in einem Iframe anzuzeigen, der ein wenig Flexibilität erfordert (mehrere Sprachen, ...). Nehmen Sie sich einen Moment Zeit und denken Sie darüber nach: Ist das alles wirklich notwendig? Wenn ich die Wahl hätte, würde ich mich für die Methode von @ Christina entscheiden

Pascalculator
quelle
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>
Salz Hareket
quelle
Dies ist nicht unbedingt eine gute Lösung für einen Iframe, der auf einer Website eines Drittanbieters geladen wird, da diese möglicherweise nicht über jQuery auf ihrer Seite verfügen.
Luke
4

Hier ist eine schnelle Lösung für die meisten Fälle:

CSS:

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

Sie können ein animiertes Lade-GIF verwenden, wenn Sie möchten,

HTML:

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

Mit dem Ereignis onload können Sie das Ladebild entfernen, nachdem die Quellseite in Ihren Iframe geladen wurde.

Wenn Sie jQuery nicht verwenden, geben Sie einfach eine ID in das div ein und ersetzen Sie diesen Teil des Codes:

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

von so etwas:

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

Alles Gute!

David Toledo
quelle
2

Ja, Sie können ein transparentes Div verwenden, das über dem Iframe-Bereich positioniert ist, mit einem Loader-GIF als einzigem Hintergrund.

Dann können Sie onloaddem iframe ein Ereignis hinzufügen:

 $(document).ready(function() {

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

Ich habe den folgenden Ansatz verfolgt

Fügen Sie zuerst Geschwister div hinzu

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

und dann, wenn der Iframe das Laden abgeschlossen hat

$("#Iframe").load(function(){
   $(this).siblings(".loading-fetching-content").remove(); 
  });
gaurav
quelle
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/[email protected]&authToken=69d1afc8d06fb97bdb5a9275edbc53b375c3c7662c88b78239ba0cd8a940d59e" ></iframe>
</div>
<script>
    $(document).ready(function () {
        $('#iframe1').on('load', function () {
            $('#loader1').hide();
        });
    });
</script>

</body>
</html>
Romi
quelle
-1

Sie können wie folgt verwenden

$('#showFrame').on("load", function () {
        loader.hide();
});
Ramesh Narayan
quelle