Захопіть повну подію завантаження iframe


Відповіді:


197

<iframe>елементи мають loadподію для цього.


Як ви слухаєте цю подію, залежить від вас, але найкращим способом є:

1) створюйте свій iframe програмно

Він гарантує, що loadслухач завжди буде викликаний, приєднавши його до того, як розпочнеться завантаження рамки iframe.

<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 - це ще один спосіб, який ви можете використовувати у своїй розмітці HTML.

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

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

3) Ви також можете приєднати слухача подій після елемента , який знаходиться всередині <script>тегу, але майте на увазі, що в цьому випадку є невелика ймовірність того, що кадр iframe вже завантажений до моменту, коли ви отримаєте додавання свого слухача. Тому можливо, що його не буде викликано (наприклад, якщо кадр є дуже швидким або йде з кешу).

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

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

Також дивіться мою іншу відповідь про те, які елементи також можуть викликати подібний тип loadподії


2
Дякую, це робить саме те, що мені було потрібно!
Хайме Гарсія

1
За допомогою цього методу ви можете виконати одну функцію лише при завантаженні iframe. Дивіться мою відповідь нижче, за допомогою addEventListenerякої можна запускати кілька зворотних викликів на події завантаження.
Iest,

1
Цей підхід також вразливий до перегонів, оскільки кадр iframe може завантажуватися перед виконанням тегу сценарію.
Iest,

7
Подія завантаження не працює при спробі завантажити файл.
Джеррі

1
Так, це не працює в IE, якщо вміст iFrame не є HTML, наприклад PDF. Дивіться це: connect.microsoft.com/IE/feedback/details/809377/…
Сергій Гусак

27

Жоден із вищезазначених відповідей не працював для мене, однак це зробило

ОНОВЛЕННЯ :

Як @doppleganger вказував нижче, завантаження втрачається, як і у jQuery 3.0, ось ось оновлена ​​версія, яка використовує on. Зверніть увагу, що насправді це буде працювати на jQuery 1.7+, тому ви можете реалізувати це таким чином, навіть якщо ви ще не користуєтеся jQuery 3.0.

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

1
Станом на jQuery 3.0, loadйого немає. Будь ласка, використовуйте .on('load', function() { ... })замість цього.
Doppelganger

Якщо ви використовуєте jqueryабо jqLiteтоді це шлях!
Петро

11

Існує ще один послідовний спосіб ( лише для IE9 + ) у ванільному JavaScript для цього:

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

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

І якщо вас цікавить " Спостережні", це робить трюк:

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

Чи викликає занепокоєння те, що мій налагоджувач зупиняється на моїй точці зламу, handleLoad()перш ніж я побачу iFrame візуалізацію? Я сподіваюся, що це суто питання виправлення, а не проблема завантаження вмісту.
Шрідхар Сарнобат

як щодо того, щоб захопити цю подію jquery, коли iframe вже є ... тобто: iframe не створюється jquery.
gumuruh

3

Зауважте, що подія завантаження, здається, не спрацьовує, якщо кадр iframe завантажується під час екрану. Це часто виникає при використанні вкладки "Відкрити в новому вікні" / w.


2
також з iframes з дисплеєм немає;)
Felipe N Moura,

1

Ви також можете зафіксувати подію, готову до jquery таким чином:

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

Ось робочий приклад:

http://jsfiddle.net/ZrFzF/


16
Я не думаю, що цей код робить те, що ви думаєте, що це робить. Ви можете замінити цей селектор "#iFrame" у вашій скрипці чим завгодно, і попередження все ще спрацює
roryok

6
Окрім @roryok, готові пожежі, коли DOM готовий, завантажується не вся сторінка.
Іван Нікітін

1
ready запускається, коли DOM готовий і js може бути виконаний, а не при завантаженні вмісту.
Сергій Гусак

2
$ ("# iframeid"). ready запускає функцію, коли елемент знаходиться в dom. Не після закінчення завантаження ifram.
Popsyjunior

він лише один раз зателефонував :(
Хоссен Бадрнежад
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.