Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / web / HTML

Detection of Loading an iframe Created in Ext JS

0.00/5 (No votes)
6 Nov 2012CPOL2 min read 24.5K  
How to detect loading an iframe created in Ext JS

Suppose you need to execute a block of code when iframe's content is loaded. In case iframe is created statically in HTML markup, the solution is really simple. All you have to do is to connect some JavaScript function with load event:

HTML
<iframe src="http://wikipedia.org" width="600" height="400" onload="someFunction();" ></iframe>

Note: The load event (onload) is invoked when the entire contents of the document is loaded (including its external elements such as images). If you need to act earlier, that is at a time when the DOM is ready, use the other methods...

But what if the iframe is created with Ext JS code?

A simple way to set it up is to use Ext.BoxComponent with correct autoEl property value. This gives you the ability to easily use iframe in Ext JS layout (e.g. as a child item of Ext.Window), without extending document tree with redundant elements. 

JavaScript
var iframeContainer = new Ext.BoxComponent({
    autoEl: {
        tag: 'iframe',
        frameborder: '0',
        src: 'http://wikipedia.org'
    },
    listeners: {
        afterrender: function () {
            console.log('rendered');

            this.getEl().on('load', function () {
                console.log('loaded');
            });
        }
    }
});

In the above code (Ext JS 3.2.1), the really important thing is the time when iframe's load event is hooked. You can do it only after the control (BoxComponent) is rendered. If you try this earlier, then getEl() will return undefined and the code will fail. Prior to rendering, an Ext JS control is just a JavaScript object, for which no document tree elements exist. Below are two screenshots showing the HTML snippets created by Ext.Window in which the only item was BoxComponent creating the iframe tag...

beforerender

DOM beforerender

afterrender

DOM afterrender

You can clearly see that premature connecting to load event is futile, becasue you simply cannot listen to events on something that does not exist.

Those screenshots come from Elements window of Chrome Developer Tools. A quick way to show that tool (of course in Google's browser) is to press Ctrl+Shift+I. Nice feature of CDT is the ability to show events being listened on a DOM element. To see the list, you have to select DOM element and, on the right side menu, choose "Event Listeners" tab. On the screenshot below, you can see that iframe's load event is indeed used:

CDT Event Listeners

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)