¿Cómo mostrar el mensaje de carga cuando se carga un iFrame?


107

Tengo un iframe que carga un sitio web de terceros que es extremadamente lento de cargar.

¿Hay alguna manera de que pueda mostrar un mensaje de carga mientras se carga el iframe y el usuario no ve un gran espacio en blanco?

PD. Tenga en cuenta que el iframe es para un sitio web de terceros, por lo que no puedo modificar / inyectar nada en su página.


Sí, no tengo conocimiento de ninguna devolución de llamada de progreso para iframes ... Hmm.
Jeffrey Sweeney

Respuestas:


231

He hecho el siguiente enfoque CSS:

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

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

1
Esto funcionó perfecto para mis casos. La única respuesta elegida no me funcionó porque estaba cargando iFrame solo cuando se hacía clic en una pestaña. Pero este se mostró elegantemente mientras se cargaba la fuente iFrame. Pero es una lástima que esta no fue elegida como la respuesta porque Jacob pidió una solución jQuery ...
dance2die

21
Esto no funciona bien si el iframe que está cargando tiene un fondo transparente. ¡Todavía puede ver el gif de carga una vez que se carga el iframe!
Westy92

3
@Christna Este truco no funciona para IE-11. ¿Hay algún truco?
mmuzahid

3
Con la función de carga de iframe puede eliminar la imagen de fondo CSS.
Hugo Cox

1
Gran respuesta. Funciona. También es mejor agregar algo de altura para que el cargador sea fácilmente visible.
Raz

33

Creo que este código va a ayudar:

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

Entiendo por qué te escondes #loadingMessagecuando hay loadfuego, pero ¿por qué también lo escondes ready? ¿No es demasiado pronto?
Teedyay

1
Depende de las necesidades del usuario. Si no necesita que se carguen todas las imágenes antes de ocultar el mensaje de carga, no necesitará la devolución de llamada en carga.
Minko Gechev

9
jquery no es "JS".
OZ_

5
@OZ_ no es difícil convertir el código anterior en javascript vanilla usando addEventListenery usar querySelectorla stylepropiedad s :-). Además de eso, el autor de la pregunta ha etiquetado como jquery. ¿No puedes entender por qué fue tu mensaje? :-)
Minko Gechev

17

Si es solo un marcador de posición lo que está tratando de lograr: un enfoque loco es inyectar texto como un fondo svg. Permite cierta flexibilidad y, por lo que he leído, el soporte del navegador debería ser bastante decente (aunque no lo he probado):

  • Cromo> = 27
  • FuegoFox> = 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;
}

¿Qué puedes cambiar?

Dentro del valor de fondo:

  • tamaño de fuente: busque font-size = "" y cambie el valor a lo que desee

  • color de fuente: busque fill = "" . No olvide reemplazar el # con% 23 si está usando la notación de color hexadecimal. % 23 representa un # en la codificación de URL que es necesario para que la cadena svg se pueda analizar en FireFox.

  • familia de fuentes: busque font-family = "" recuerde evitar las comillas simples si tiene una fuente que consta de varias palabras (como con \ 'Lucida Grande \')

  • texto: busque el valor de elemento del elemento de texto donde ve la cadena PLACEHOLDER . Puede reemplazar la cadena PLACEHOLDER con cualquier cosa que sea compatible con la URL (los caracteres especiales deben convertirse a notación de porcentaje)

Ejemplo de violín

Pros:

  • Sin elementos HTML adicionales
  • No js
  • El texto se puede ajustar fácilmente sin necesidad de un programa externo
  • Es SVG, por lo que puede colocar fácilmente cualquier SVG que desee.

Contras:

  • Soporte de navegador
  • Es complejo
  • Es hacky
  • Si el iframe-src no tiene un fondo establecido, el marcador de posición brillará (lo cual no es inherente a este método, sino solo comportamiento estándar cuando usa un bg en el iframe)

Solo recomendaría esto solo si es absolutamente necesario mostrar texto como un marcador de posición en un iframe que requiere un poco de flexibilidad (varios idiomas, ...). Tómate un momento y reflexiona: ¿es todo esto realmente necesario? Si pudiera elegir, optaría por el 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 no es necesariamente una buena solución para un iframe que se carga en un sitio web de terceros, ya que es posible que no tengan jQuery en su página.
Luke

4

Aquí hay una solución rápida para la mayoría de los casos:

CSS:

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

Puede usar un GIF de carga animado si lo desea,

HTML:

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

Con el evento onload, puede eliminar la imagen de carga después de que la página de origen se cargue dentro de su iframe.

Si no está utilizando jQuery, simplemente coloque una identificación en el div y reemplace esta parte del código:

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

por algo como esto:

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

¡Todo lo mejor!


2

Sí, puede usar un div transparente colocado sobre el área del iframe, con un gif de cargador como único fondo.

Luego, puede adjuntar un onloadevento al iframe:

 $(document).ready(function() {

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

1

He seguido el siguiente enfoque

Primero, agregue div hermano

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

y luego cuando el iframe completó la carga

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

Puede usar lo siguiente

$('#showFrame').on("load", function () {
        loader.hide();
});
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.