Czy istnieje sposób na uchwycenie momentu pełnego załadowania zawartości elementu iframe ze strony nadrzędnej?
Czy istnieje sposób na uchwycenie momentu pełnego załadowania zawartości elementu iframe ze strony nadrzędnej?
Odpowiedzi:
<iframe>
elementy mają na to load
wydarzenie .To, jak słuchasz tego wydarzenia, zależy od Ciebie, ale ogólnie najlepszym sposobem jest:
1) utwórz programowo element iframe
Zapewnia to, że load
słuchacz jest zawsze wywoływany, dołączając go przed rozpoczęciem ładowania elementu 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) wbudowany javascript to kolejny sposób, w jaki możesz użyć wewnątrz znaczników HTML.
<script>
function onMyFrameLoad() {
alert('myframe is loaded');
};
</script>
<iframe id="myframe" src="..." onload="onMyFrameLoad(this)"></iframe>
3) Możesz również dołączyć detektor zdarzenia po elemencie , wewnątrz <script>
tagu, ale pamiętaj, że w tym przypadku istnieje niewielka szansa, że element iframe jest już załadowany do czasu dodania listenera. Dlatego możliwe jest, że nie zostanie wywołany (np. Jeśli ramka iframe jest bardzo szybka lub pochodzi z pamięci podręcznej).
<iframe id="myframe" src="..."></iframe>
<script>
document.getElementById('myframe').onload = function() {
alert('myframe is loaded');
};
</script>
Zobacz także moją drugą odpowiedź na temat tego, które elementy mogą również wywoływać tego typu load
zdarzenia
addEventListener
który umożliwia wielokrotne wywołania zwrotne do uruchomienia w przypadku obciążenia.
Żadna z powyższych odpowiedzi nie zadziałała dla mnie, jednak zadziałała
AKTUALIZACJA :
Jak @doppleganger wskazał poniżej, ładowanie zniknęło od jQuery 3.0, więc oto zaktualizowana wersja, która używa on
. Pamiętaj, że to faktycznie zadziała w jQuery 1.7+, więc możesz to zaimplementować w ten sposób, nawet jeśli nie jesteś jeszcze w jQuery 3.0.
$('iframe').on('load', function() {
// do stuff
});
load
nie ma. Użyj .on('load', function() { ... })
zamiast tego.
jquery
lub jqLite
to jest droga do zrobienia!
Jest na to inny spójny sposób ( tylko dla IE9 + ) w waniliowym JavaScript:
const iframe = document.getElementById('iframe');
const handleLoad = () => console.log('loaded');
iframe.addEventListener('load', handleLoad, true)
A jeśli interesują Cię Observables, to załatwia sprawę :
return Observable.fromEventPattern(
handler => iframe.addEventListener('load', handler, true),
handler => iframe.removeEventListener('load', handler)
);
handleLoad()
zanim zobaczę renderowanie elementu iFrame? Mam nadzieję, że jest to wyłącznie problem z renderowaniem, a nie z ładowaniem treści.
Zwróć uwagę, że zdarzenie onload nie jest uruchamiane, jeśli element iframe jest ładowany poza ekranem. Dzieje się tak często podczas używania kart „Otwórz w nowym oknie” / w.
Możesz również przechwycić zdarzenia gotowe do jquery w ten sposób:
$('#iframeid').ready(function () {
//Everything you need.
});
Oto działający przykład: