Как да накарате javascript в един кадър да изчака, докато страницата се зареди във втори кадър

Имам два кадъра в набор от рамки - frame[0] съдържа скрипт, който зарежда страница в frame[1] с помощта на

top.frames[1].location.href = 'http://some_location.com/page.html';

и след това извършва действия на тази страница, например търсене на текст в страницата. Трябва ми скриптът да изчака, докато page.html се зареди във втория кадър, преди да направя това, и не мога да използвам onload=... във втората страница, защото нямам контрол върху неговия източник.

Има ли начин това да стане?


person Keir Finlow-Bates    schedule 05.08.2009    source източник


Отговори (3)


използвайте събитие при зареждане на елемент FRAME

редактиране:

<frame onload = "if( top.frames[1].location.pathname == '/page.html' " ) alert( 'loaded' )";

или ако зареждате различни страници в една и съща рамка, използвайте това:

<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' )";
person palindrom    schedule 05.08.2009
comment
Бихте ли разширили това? Ако използвам top.frames[1].location.href = 'ongar.org/mypage.html '; top.frames[1].onload(alert('loaded')); Получавам предупреждението, преди да се зареди mypage.html, защото вече има страница в рамка[1]. Бих искал предупреждението, след като mypage.html се зареди напълно. - person Keir Finlow-Bates; 05.08.2009
comment
Вярно е, но в горния пример сте пропуснали клаузата, проверяваща стойността на location.pathname на новата страница. - person Oliver Turner; 05.08.2009
comment
onload събитията в iframes са някак си безполезни - те са много непоследователни в различните браузъри, дори в рамките на браузър разбирането защо onload се задейства може да бъде объркващо. Използвайте с повишено внимание! - person mixonic; 05.08.2009
comment
@mixonic: само ако въпросът беше за iframes. - person palindrom; 05.08.2009

Е, правя това и работи.

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;
  }
}
person Ana    schedule 14.10.2009

Ако нямате контрол върху източника на заредената страница и по-важното, ако тя идва от друг домейн, тогава има само един отговор:

не можеш

Интерфрейм комуникация между различни домейни НЕ е възможна. И имате нужда от комуникация между рамки, защото ще ви трябва нещо като функцията за готовност на jquery в заредената страница, за да определи дали цялата страница (DOM) е заредена.

person Colin    schedule 05.08.2009