Jak wyświetlić komunikat o wczytywaniu podczas ładowania elementu iFrame?

107

Mam element iframe, który ładuje witrynę innej firmy, która ładuje się bardzo wolno.

Czy istnieje sposób, w jaki mogę wyświetlić komunikat o ładowaniu, podczas gdy element iframe ładuje się, użytkownik nie widzi dużej pustej przestrzeni?

PS. Pamiętaj, że element iframe jest przeznaczony dla witryny internetowej innej firmy, więc nie mogę niczego modyfikować / wstrzykiwać na ich stronie.

Jakub
źródło
Tak, nie znam żadnych wywołań zwrotnych postępu dla ramek iframe ... Hmm.
Jeffrey Sweeney,

Odpowiedzi:

232

Zrobiłem następujące podejście CSS:

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

.holds-the-iframe {
  background:url(../images/loader.gif) center center no-repeat;
}
Christina
źródło
1
To działało idealnie w moich przypadkach. Jedna wybrana odpowiedź nie zadziałała, ponieważ ładowałem element iFrame tylko wtedy, gdy klikano kartę. Ale ten wyświetlał się elegancko podczas ładowania źródła iFrame. Ale szkoda, że nie został wybrany jako odpowiedź ponieważ Jacob poprosił o rozwiązanie jQuery ...
dance2die
21
Nie działa to dobrze, jeśli ładowany element iframe ma przezroczyste tło. Po załadowaniu elementu iframe nadal możesz zobaczyć ładujący się gif!
Westy92
3
@Christna Ta sztuczka nie działa dla IE-11. Czy jest jakiś hack?
mmuzahid
3
Dzięki funkcji iframe onload możesz usunąć obraz tła CSS.
Hugo Cox
1
Świetna odpowiedź. To działa. Lepiej też dodaj trochę wysokości, aby ładowarka była dobrze widoczna.
Raz
33

Myślę, że ten kod pomoże:

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
źródło
Rozumiem, dlaczego chowasz się #loadingMessagepodczas loadpożarów, ale dlaczego też to ukrywasz ready? Czy to nie za wcześnie?
teedyay
1
To zależy od potrzeb użytkownika. Jeśli nie potrzebuje załadowania wszystkich obrazów, zanim ukryje komunikat o ładowaniu, nie będzie potrzebował wywołania zwrotnego podczas ładowania.
Minko Gechev,
9
jquery to nie „JS”.
OZ_
5
@OZ_ to nie jest trudne, aby włączyć powyższy kod do waniliowym za pomocą javascript addEventListeneri wykorzystywanie querySelector+ styles nieruchomość :-). Oprócz tego autor pytania oznaczył jako jquery. Nie możesz dowiedzieć się, dlaczego otrzymałeś wiadomość? :-)
Minko Gechev
17

Jeśli jest to tylko symbol zastępczy, który próbujesz osiągnąć: szalonym podejściem jest wstawienie tekstu jako tła SVG. Pozwala na pewną elastyczność, az tego, co przeczytałem, obsługa przeglądarek powinna być całkiem przyzwoita (chociaż jej nie testowałem):

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

Co możesz zmienić?

Wewnątrz wartości tła:

  • rozmiar czcionki: poszukaj czcionki font-size = "" i zmień wartość na dowolną

  • kolor czcionki: szukaj wypełnienia = „” . Nie zapomnij zamienić znaku # na% 23, jeśli używasz szesnastkowej notacji kolorów. % 23 oznacza znak # w kodowaniu adresu URL, który jest niezbędny, aby ciąg svg mógł zostać przeanalizowany w programie FireFox.

  • rodzina czcionek: szukaj font-family = "" pamiętaj, aby pominąć pojedyncze cudzysłowy, jeśli masz czcionkę składającą się z wielu słów (np. \ 'Lucida Grande \')

  • tekst: poszukaj wartości elementu elementu tekstowego w miejscu, w którym znajduje się ciąg PLACEHOLDER . Możesz zamienić ciąg PLACEHOLDER na wszystko, co jest zgodne z adresem URL (znaki specjalne należy przekonwertować na notację procentową)

Przykład na skrzypcach

Plusy:

  • Bez dodatkowych elementów HTML
  • Nie js
  • Tekst można łatwo (...) dostosować bez konieczności korzystania z zewnętrznego programu
  • Jest to SVG, więc możesz łatwo umieścić tam dowolny plik SVG.

Cons:

  • Wsparcie przeglądarki
  • To skomplikowane
  • To jest hacky
  • Jeśli iframe-src nie ma ustawionego tła, symbol zastępczy będzie świecił (co nie jest nieodłączne dla tej metody, ale tylko standardowe zachowanie, gdy używasz bg w iframe)

Poleciłbym to tylko wtedy, gdy jest to absolutnie konieczne, aby pokazać tekst jako symbol zastępczy w ramce iframe, która wymaga trochę elastyczności (wiele języków, ...). Poświęć chwilę i zastanów się: czy to wszystko jest naprawdę konieczne? Gdybym miał wybór, wybrałbym metodę @ Christiny

Pascalculator
źródło
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>
Salt Hareket
źródło
Niekoniecznie jest to dobre rozwiązanie dla elementu iframe, który ładuje się na stronie internetowej innej firmy, ponieważ mogą one nie mieć jQuery na swojej stronie.
Luke
4

Oto szybkie rozwiązanie w większości przypadków:

CSS:

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

Jeśli chcesz, możesz użyć animowanego ładującego się pliku GIF,

HTML:

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

Korzystając ze zdarzenia onload, możesz usunąć obraz ładowania po załadowaniu strony źródłowej wewnątrz elementu iframe.

Jeśli nie używasz jQuery, po prostu umieść id w div i zamień tę część kodu:

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

przez coś takiego:

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

Wszystkiego najlepszego!

David Toledo
źródło
2

Tak, możesz użyć przezroczystego div umieszczonego nad obszarem iframe, z gifem wczytującym jako jedynym tłem.

Następnie możesz dołączyć onloadzdarzenie do elementu iframe:

 $(document).ready(function() {

   $("iframe#id").load(function() {
      $("#loader-id").hide();
   });
});
maxijb
źródło
1

Postępowałem zgodnie z następującym podejściem

Najpierw dodaj element div dla rodzeństwa

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

i wtedy, gdy element iframe zakończy ładowanie

$("#Iframe").load(function(){
   $(this).siblings(".loading-fetching-content").remove(); 
  });
gaurav
źródło
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
źródło
-1

Możesz użyć jak poniżej

$('#showFrame').on("load", function () {
        loader.hide();
});
Ramesh Narayan
źródło