Как заставить 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(оповещение('загружено')); Я получаю предупреждение до того, как mypage.html загрузится, потому что в кадре [1] уже есть страница. Я хочу получить предупреждение после полной загрузки mypage.html. - person Keir Finlow-Bates; 05.08.2009
comment
Верно, но в приведенном выше примере вы пропустили пункт, проверяющий значение location.pathname новой страницы. - person Oliver Turner; 05.08.2009
comment
События onload в iframe бесполезны — они очень непоследовательны в разных браузерах, даже в браузере понимание того, почему срабатывает onload, может быть запутанным. Используйте с осторожностью! - person mixonic; 05.08.2009
comment
@mixonic: если бы вопрос был только об фреймах. - 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