How to get javascript in one frame to wait until a page has loaded in a second frame
-
22-07-2019 - |
Question
I have two frames in a frameset - frame[0]
contains a script that loads a page into frame[1]
using
top.frames[1].location.href = 'http://some_location.com/page.html';
and then performs actions on that page, for example searching text within the page. I need the script to wait until page.html
has loaded in the second frame before doing this, and I can't use onload=...
in the second page because I have no control over its source.
Is there a way to do this?
Solution
use onload event of FRAME element
edit:
<frame onload = "if( top.frames[1].location.pathname == '/page.html' " ) alert( 'loaded' )";
or if you load different pages to the same frame use this:
<frame onload = "if( top.frames[1].location.pathname != 'about:blank' " ) alert( 'loaded' )";
or
<frame src = '/dummyInitial.html' onload = "if( top.frames[1].location.pathname != '/dummyInitial.html' " ) alert( 'loaded' )";
OTHER TIPS
Well I do this, and it works.
var idInterval;
function callPage()
{ top.main.document.location.href = somepage.aspx;
document.getElementById('divLoading').style.visibility ="visible";
idInterval = setInterval("validaFrameMain()",50);
}
//look if the frame page is complete load
function validaFrameMain()
{
if (top.main.document.readyState != "complete")
{document.getElementById('divLoading').style.visibility ="visible";}
else
{ document.getElementById('divLoading').style.visibility ="hidden";;
clearInterval(idInterval);
idInterval = nothing;
}
}
If you have no control over the loaded page's source and more importantly, if it is coming from another domain, then there is only one answer:
You can't.
Interframe communication between different domains is NOT possible. And you need interframe communication because you would need something like jquery's ready function in the loaded page to determine if the entire page (the DOM) is loaded.