Como exibir a mensagem de carregamento quando um iframe está carregando?


107

Eu tenho um iframe que carrega um site de terceiros que é extremamente lento para carregar.

Existe uma maneira de exibir uma mensagem de carregamento enquanto o iframe carrega e o usuário não vê um grande espaço em branco?

PS. Observe que o iframe é para um site de terceiros, portanto, não posso modificar / injetar nada em sua página.


Sim, não estou ciente de nenhum retorno de chamada de progresso para iframes ... Hmm.
Jeffrey Sweeney

Respostas:


232

Eu fiz a seguinte abordagem css:

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

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

1
Isso funcionou perfeitamente para meus casos. A única resposta escolhida não funcionou para mim porque eu estava carregando o iFrame apenas quando uma guia estava sendo clicada. Mas este foi exibido elegantemente ao carregar o código-fonte iFrame. Mas uma pena que esta não foi escolhida como a resposta porque Jacob pediu uma solução jQuery ...
dance2die

21
Isso não funcionará bem se o iframe que você está carregando tiver um fundo transparente. Você ainda pode ver o gif de carregamento depois que o iframe carregar!
Westy92

3
@Christna Este truque não está funcionando para o IE-11. Existe algum hack?
mmuzahid

3
Com a função iframe onload, você pode remover a imagem de fundo CSS.
Hugo Cox

1
Ótima resposta. Funciona. Também é melhor adicionar um pouco de altura para que o carregador fique facilmente visível.
Raz

33

Acho que este código vai ajudar:

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

Eu entendo porque você se esconde #loadingMessagequando loaddispara, mas por que você também esconde ready? Não é muito cedo?
terça

1
Depende das necessidades do usuário. Se ele não precisar que todas as imagens sejam carregadas antes de ocultar a mensagem de carregamento, ele não precisará do retorno de chamada ao carregar.
Minko Gechev

9
jquery não é "JS".
OZ_

5
@OZ_ não é difícil transformar o código acima em javascript vanilla usando addEventListenere querySelector+ a stylepropriedade s :-). Além disso, o autor da pergunta marcada é como jquery. Não consegue entender porque foi sua mensagem? :-)
Minko Gechev

17

Se for apenas um espaço reservado que você está tentando alcançar: uma abordagem maluca é injetar texto como um fundo SVG. Ele permite alguma flexibilidade e, pelo que li, o suporte do navegador deve ser bastante decente (embora não o testei):

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

O que você pode mudar?

Dentro do valor de fundo:

  • tamanho da fonte: procure por font-size = "" e altere o valor para o que quiser

  • cor da fonte: procure por fill = "" . Não se esqueça de substituir o # por% 23 se estiver usando a notação de cores hexadecimal. % 23 significa # na codificação de URL que é necessário para que a string svg possa ser analisada no FireFox.

  • família de fontes: procure font-family = "" lembre-se de deixar as aspas simples se você tiver uma fonte que consiste em várias palavras (como com \ 'Lucida Grande \')

  • text: procure o valor do elemento do text-element onde você vê a string PLACEHOLDER . Você pode substituir a string PLACEHOLDER por qualquer coisa que seja compatível com url (caracteres especiais precisam ser convertidos em notação de porcentagem)

Exemplo de violino

Prós:

  • Sem elementos HTML extras
  • Não js
  • O texto pode ser facilmente (...) ajustado sem a necessidade de um programa externo
  • É SVG, então você pode facilmente colocar qualquer SVG que desejar.

Contras:

  • Suporte de navegador
  • É complexo
  • É hacky
  • Se o iframe-src não tiver um plano de fundo definido, o espaço reservado irá brilhar (o que não é inerente a este método, mas apenas o comportamento padrão quando você usa um bg no iframe)

Eu só recomendaria isso apenas se for absolutamente necessário mostrar o texto como um espaço reservado em um iframe que requer um pouco de flexibilidade (vários idiomas, ...). Pare um pouco e reflita sobre isso: tudo isso é realmente necessário? Se eu tivesse escolha, escolheria o método de @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>

Esta não é necessariamente uma boa solução para um iframe que está carregando em um site de terceiros, pois eles podem não ter o jQuery em sua página.
Lucas,

4

Esta é uma solução rápida para a maioria dos casos:

CSS:

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

Você pode usar um GIF animado de carregamento se quiser,

HTML:

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

Usando o evento onload, você pode remover a imagem de carregamento depois que a página de origem for carregada em seu iframe.

Se você não estiver usando jQuery, apenas coloque um id no div e substitua esta parte do código:

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

por algo assim:

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

Muito bem sucedida!


2

Sim, você pode usar um div transparente posicionado sobre a área do iframe, com um gif do carregador como único plano de fundo.

Em seguida, você pode anexar um onloadevento ao iframe:

 $(document).ready(function() {

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

1

Eu segui a seguinte abordagem

Primeiro, adicione div irmão

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

e então quando o iframe terminar de carregar

$("#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

Você pode usar como abaixo

$('#showFrame').on("load", function () {
        loader.hide();
});
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.