Is there a way to capture when the contents of an iframe have fully loaded from the parent page?
<iframe>
elements have a load
event for that.
How you listen to that event is up to you, but generally the best way is to:
1) create your iframe programatically
It makes sure your load
listener is always called by attaching it before the iframe starts loading.
<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) inline javascript, is another way that you can use inside your HTML markup.
<script>
function onMyFrameLoad() {
alert('myframe is loaded');
};
</script>
<iframe id="myframe" src="..." onload="onMyFrameLoad(this)"></iframe>
3) You may also attach the event listener after the element, inside a <script>
tag, but keep in mind that in this case, there is a slight chance that the iframe is already loaded by the time you get to adding your listener. Therefore it's possible that it will not be called (e.g. if the iframe is very very fast, or coming from cache).
<iframe id="myframe" src="..."></iframe>
<script>
document.getElementById('myframe').onload = function() {
alert('myframe is loaded');
};
</script>
Also see my other answer about which elements can also fire this type of load
event
addEventListener
which allows multiple callbacks to run on the load event. –
Pliers load
event. Now, you may use it in different ways. Of course you can use addEventListener
, keep in mind this answer is from 2010 when it was safer to show the concept with the onload
property which worked in IE too (again, concept with the least amount of code). Your suggestion of the <script>
coming before the iframe
can fail because getElementById
is not guaranteed to find an element below the script
tag. You may create the iframe programatically. That's the safest way to ensure your listener is added before the load event. –
Cyanogen src
and onload
blank in the iframe
tag, and then in javascript: document.getElementById('myframe').setAttribute('onload', '...'); document.getElementById('myframe').setAttribute('src', '...');
–
Inch load
event of the iframe
element. MDN only lists the load
event for Window
and XMLHttpRequest
. Can anyone post a link to an authentic reference? I only found mentions of the event in W3C spec –
Leg iframe
is already in the document, simply re-insert the iframe
element (get it via query selector, then append the node somewhere) after adding the load event to it. Yes, this loads the iframe
twice, but it's a workaround. –
Ogawa Neither of the above answers worked for me, however this did
UPDATE:
As @doppleganger pointed out below, load is gone as of jQuery 3.0, so here's an updated version that uses on
. Please note this will actually work on jQuery 1.7+, so you can implement it this way even if you're not on jQuery 3.0 yet.
$('iframe').on('load', function() {
// do stuff
});
load
is gone. Please use .on('load', function() { ... })
instead. –
Shoebill jquery
or jqLite
then this is the way to go! –
Pharr There is another consistent way (only for IE9+) in vanilla JavaScript for this:
const iframe = document.getElementById('iframe');
const handleLoad = () => console.log('loaded');
iframe.addEventListener('load', handleLoad, true)
And if you're interested in Observables this does the trick:
import { fromEvent } from 'rxjs';
const iframe = document.getElementById('iframe');
fromEvent(iframe, 'load').subscribe(() => console.log('loaded'));
handleLoad()
before I see the iFrame render? I hope that's purely a rendering issue rather than a content loading issue. –
Maricela Note that the onload event doesn't seem to fire if the iframe is loaded when offscreen. This frequently occurs when using "Open in New Window" /w tabs.
Step 1: Add iframe
in template.
<iframe id="uvIFrame" src="www.google.com"></iframe>
Step 2: Add load listener in Controller.
document.querySelector('iframe#uvIFrame').addEventListener('load', function () {
$scope.loading = false;
$scope.$apply();
});
You can also capture jquery ready event this way:
$('#iframeid').ready(function () {
//Everything you need.
});
Here is a working example:
© 2022 - 2024 — McMap. All rights reserved.