Capturar evento completo de carga de iframe


Respuestas:


197

<iframe>los elementos tienen un loadevento para eso.


La forma en que escuche ese evento depende de usted, pero generalmente la mejor manera es:

1) crea tu iframe programáticamente

Se asegura de que loadsiempre se llame a su oyente al adjuntarlo antes de que el iframe comience a cargarse.

<script>
var iframe = document.createElement('iframe');
iframe.onload = function() { alert('myframe is loaded'); }; // before setting 'src'
iframe.src = '...'; 
document.body.appendChild(iframe); // add it to wherever you need it in the document
</script>

2) JavaScript en línea , es otra forma que puede usar dentro de su marcado HTML.

<script>
function onMyFrameLoad() {
  alert('myframe is loaded');
};
</script>

<iframe id="myframe" src="..." onload="onMyFrameLoad(this)"></iframe>

3) También puede adjuntar el detector de eventos después del elemento , dentro de una <script>etiqueta, pero tenga en cuenta que en este caso, existe una pequeña posibilidad de que el iframe ya esté cargado cuando llegue el momento de agregar su detector. Por lo tanto, es posible que no se llame (p. Ej., Si el iframe es muy rápido o proviene de la memoria caché).

<iframe id="myframe" src="..."></iframe>

<script>
document.getElementById('myframe').onload = function() {
  alert('myframe is loaded');
};
</script>

También vea mi otra respuesta sobre qué elementos también pueden activar este tipo de loadevento


2
¡Gracias, esto hace exactamente lo que necesitaba!
Jaime Garcia

1
Con este método, solo puede ejecutar una única función cuando se carga el iframe. Vea mi respuesta a continuación usando addEventListenerque permite que se ejecuten múltiples devoluciones de llamada en el evento de carga.
Iest

1
Este enfoque también es vulnerable a una condición de carrera, ya que el iframe podría cargarse antes de que se ejecute la etiqueta del script.
Iest

77
El evento de carga no funciona cuando intenta descargar un archivo.
Jerry

1
Sí, eso no funciona en IE si el contenido de iFrame no es HTML, por ejemplo, PDF. Vea esto: connect.microsoft.com/IE/feedback/details/809377/…
Sergey Gussak

27

Ninguna de las respuestas anteriores funcionó para mí, sin embargo, esto sí

ACTUALIZACIÓN :

Como @doppleganger señaló a continuación, la carga ha desaparecido a partir de jQuery 3.0, así que aquí hay una versión actualizada que utiliza on. Tenga en cuenta que esto realmente funcionará en jQuery 1.7+, por lo que puede implementarlo de esta manera incluso si aún no está en jQuery 3.0.

$('iframe').on('load', function() {
    // do stuff 
});

1
A partir de jQuery 3.0, loadse ha ido. Por favor, use .on('load', function() { ... })en su lugar.
Doppelganger

Si está usando jqueryo jqLiteeste es el camino a seguir!
Peter

11

Hay otra forma consistente ( solo para IE9 + ) en JavaScript vainilla para esto:

const iframe = document.getElementById('iframe');
const handleLoad = () => console.log('loaded');

iframe.addEventListener('load', handleLoad, true)

Y si estás interesado en Observables, este es el truco:

return Observable.fromEventPattern(
  handler => iframe.addEventListener('load', handler, true),
  handler => iframe.removeEventListener('load', handler)
);

¿Es preocupante que mi depurador se detenga en mi punto de interrupción handleLoad()antes de ver el renderizado de iFrame? Espero que sea solo un problema de representación en lugar de un problema de carga de contenido.
Sridhar Sarnobat

qué tal capturar ese evento mediante jquery cuando el iframe ya está allí ... es decir: jquery no crea el iframe.
Gumuruh

3

Tenga en cuenta que el evento de carga no parece activarse si el iframe se carga cuando está fuera de la pantalla. Esto ocurre frecuentemente cuando se usan las pestañas "Abrir en una nueva ventana" / w.


2
también con iframes con display none;)
Felipe N Moura

1

También puede capturar el evento jquery ready de esta manera:

$('#iframeid').ready(function () {
//Everything you need.
});

Aquí hay un ejemplo de trabajo:

http://jsfiddle.net/ZrFzF/


16
No creo que ese código haga lo que tú crees que hace. Puede reemplazar ese selector "#iFrame" en su violín con cualquier cosa y la alerta aún se dispara
roryok

66
Además de @roryok, ready se dispara cuando DOM está listo, no se carga toda la página.
Ivan Nikitin

1
ready se dispara cuando el DOM está listo y se puede ejecutar js, no cuando se carga el contenido.
Sergey Gussak

2
$ ("# iframeid"). ready activa la función cuando el elemento está en el dom. No cuando el ifram ha terminado de cargarse.
Popsyjunior

solo llamó una vez :(
Hossein Badrnezhad
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.