Tangkap iframe memuat aktivitas lengkap


Jawaban:


197

<iframe>elemen punya loadacara untuk itu.


Bagaimana Anda mendengarkan acara itu terserah Anda, tetapi umumnya cara terbaik adalah:

1) buat iframe Anda secara terprogram

Itu memastikan loadpendengar Anda selalu dipanggil dengan melampirkannya sebelum iframe mulai memuat.

<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 sebaris , adalah cara lain yang dapat Anda gunakan di dalam markup HTML Anda.

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

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

3) Anda juga dapat melampirkan pendengar acara setelah elemen , di dalam <script>tag, tetapi perlu diingat bahwa dalam kasus ini, ada sedikit peluang bahwa iframe sudah dimuat pada saat Anda menambahkan pendengar Anda. Karena itu ada kemungkinan bahwa itu tidak akan dipanggil (misalnya jika iframe sangat cepat, atau berasal dari cache).

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

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

Lihat juga jawaban saya yang lain tentang elemen mana yang juga dapat memecat jenis loadperistiwa ini


2
Terima kasih, ini tepat seperti yang saya butuhkan!
Jaime Garcia

1
Dengan metode ini Anda hanya dapat menjalankan fungsi tunggal saat iframe dimuat. Lihat jawaban saya di bawah ini menggunakan addEventListeneryang memungkinkan beberapa panggilan balik berjalan pada acara memuat.
Iest

1
Pendekatan ini juga rentan terhadap kondisi balapan karena iframe dapat dimuat sebelum tag skrip dieksekusi.
Iest

7
Acara memuat tidak berfungsi ketika Anda mencoba mengunduh file.
Jerry

1
Ya, itu tidak berfungsi di IE jika konten iFrame bukan HTML, misalnya PDF. Lihat ini: connect.microsoft.com/IE/feedback/details/809377/…
Sergey Gussak

27

Tidak satu pun dari jawaban di atas bekerja untuk saya, namun ini berhasil

PEMBARUAN :

Seperti @doppleganger tunjukkan di bawah, beban hilang pada jQuery 3.0, jadi inilah versi terbaru yang digunakan on. Harap dicatat ini sebenarnya akan berfungsi pada jQuery 1.7+, sehingga Anda dapat menerapkannya dengan cara ini bahkan jika Anda belum menggunakan jQuery 3.0.

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

1
Pada jQuery 3.0, loadhilang. Silakan gunakan .on('load', function() { ... })sebagai gantinya.
Doppelganger

Jika Anda menggunakan jqueryatau jqLiteini adalah cara untuk pergi!
Peter

11

Ada cara lain yang konsisten ( hanya untuk IE9 + ) dalam JavaScript vanilla untuk ini:

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

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

Dan jika Anda tertarik pada Observables, ini akan membantu:

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

Apakah saya khawatir debugger saya berhenti di breakpoint saya handleLoad()sebelum saya melihat render iFrame? Saya harap itu murni masalah rendering daripada masalah pemuatan konten.
Sridhar Sarnobat

bagaimana untuk menangkap acara itu dengan jquery ketika iframe sudah ada ... yaitu: iframe tidak dibuat oleh jquery.
gumuruh

3

Perhatikan bahwa acara onload sepertinya tidak akan aktif jika iframe dimuat saat offscreen. Ini sering terjadi ketika menggunakan tab "Buka di Jendela Baru" / w.


2
juga dengan iframe tanpa tampilan;)
Felipe N Moura

1

Anda juga dapat menangkap acara siap jquery dengan cara ini:

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

Berikut ini contoh kerjanya:

http://jsfiddle.net/ZrFzF/


16
Saya tidak berpikir bahwa kode melakukan apa yang Anda pikirkan. Anda dapat mengganti pemilih "#iFrame" di biola Anda dengan apa pun dan peringatan itu masih menyala
roryok

6
Selain @roryok, api siap saat DOM siap, bukan seluruh halaman dimuat.
Ivan Nikitin

1
ready dipecat ketika DOM siap dan js dapat dieksekusi, bukan saat konten dimuat.
Sergey Gussak

2
$ ("# iframeid"). ready memicu fungsi ketika elemen berada di dom. Tidak ketika ifram selesai memuat.
Popsyjunior

hanya disebut sekali :(
Hossein Badrnezhad
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.