Cattura evento completo caricamento iframe


Risposte:


197

<iframe>gli elementi hanno un loadevento per questo.


Come ascolti quell'evento dipende da te, ma generalmente il modo migliore è:

1) crea il tuo iframe a livello di codice

Si assicura che il tuo loadlistener sia sempre chiamato collegandolo prima che l'iframe inizi a caricarsi.

<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 incorporato , è un altro modo che puoi usare all'interno del tuo markup HTML.

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

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

3) Puoi anche collegare il listener di eventi dopo l'elemento , all'interno di un <script>tag, ma tieni presente che in questo caso, c'è una leggera possibilità che l'iframe sia già caricato quando arrivi ad aggiungere il tuo listener. Pertanto è possibile che non venga chiamato (ad esempio se l'iframe è molto molto veloce o proviene dalla cache).

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

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

Vedi anche la mia altra risposta su quali elementi possono anche generare questo tipo di loadevento


2
Grazie, fa esattamente quello di cui avevo bisogno!
Jaime Garcia,

1
Con questo metodo è possibile eseguire un'unica funzione quando l'iframe è caricato. Vedere la mia risposta qui sotto usando addEventListenerche consente a più callback di eseguire l'evento di carico.
Il

1
Questo approccio è anche vulnerabile a una race condition in quanto l'iframe potrebbe caricarsi prima dell'esecuzione del tag script.
Il

7
L'evento load non funziona quando si tenta di scaricare un file.
Jerry,

1
Sì, non funziona in IE se il contenuto di iFrame non è HTML, ad esempio PDF. Vedi questo: connect.microsoft.com/IE/feedback/details/809377/…
Sergey Gussak,

27

Nessuna delle risposte sopra ha funzionato per me, tuttavia questo ha funzionato

AGGIORNAMENTO :

Come indicato da @doppleganger di seguito, il caricamento è andato da jQuery 3.0, quindi ecco una versione aggiornata che utilizza on. Si noti che funzionerà effettivamente su jQuery 1.7+, quindi è possibile implementarlo in questo modo anche se non si è ancora su jQuery 3.0.

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

1
A partire da jQuery 3.0, non loadc'è più. Si prega di utilizzare .on('load', function() { ... })invece.
Doppelganger,

Se stai usando jqueryo jqLiteallora questa è la strada da percorrere!
Peter

11

C'è un altro modo coerente ( solo per IE9 + ) in JavaScript vanilla per questo:

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

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

E se sei interessato agli osservabili, questo è il trucco:

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

È preoccupante che il mio debugger si fermi al punto di interruzione handleLoad()prima di vedere il rendering di iFrame? Spero che sia puramente un problema di rendering piuttosto che un problema di caricamento dei contenuti.
Sridhar Sarnobat,

che ne dici di catturare quell'evento da jquery quando l'iframe è già lì ... cioè: l'iframe non è creato da jquery.
Gumuruh,

3

Si noti che l'evento onload non sembra attivarsi se l'iframe viene caricato quando è fuori schermo. Ciò si verifica spesso quando si utilizzano le schede "Apri in una nuova finestra" / w.


2
anche con iframe con display none;)
Felipe N Moura

1

Puoi anche catturare l'evento pronto per jquery in questo modo:

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

Ecco un esempio funzionante:

http://jsfiddle.net/ZrFzF/


16
Non penso che il codice faccia quello che pensi che faccia. Puoi sostituire quel selettore "#Frame" nel tuo violino con qualsiasi cosa e l'avviso si
attiva

6
Oltre a @roryok, ready viene attivato quando DOM è pronto, non l'intera pagina viene caricata.
Ivan Nikitin,

1
ready viene attivato quando il DOM è pronto e js può essere eseguito, non quando il contenuto viene caricato.
Sergey Gussak,

2
$ ("# iframeid"). ready attiva la funzione quando l'elemento si trova nel dom. Non quando ifram ha terminato il caricamento.
Popsyjunior,

chiamò solo una volta :(
Hossein Badrnezhad
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.