Не удается получить доступ к содержимому другого фрейма в Chrome - PullRequest
0 голосов
/ 25 апреля 2011

У меня есть два кадра.Страницы в обоих фреймах происходят из одного и того же домена (либо localhost, либо реального домена - оба используют один и тот же протокол).

Первый кадр должен получить доступ к элементам второго фрейма (xsample), когда он полностью загружен ивсе функции JS для загрузки завершены.Но загрузка второго кадра занимает некоторое время.

<frameset cols="*,*" rows="*" border="0" framespacing="0">
    <frame src="picker.asp" name="xpicker" frameborder="no" marginwidth="15" marginheight="15">
    <frame src="doc.asp" name="xsample" frameborder="no" marginwidth="15" marginheight="15">
</frameset>

Приведенный ниже код работает в IE и Firefox, но не в Chrome или Safari, в тех случаях parent.xsample всегда ложно

function startWork(){
if(isSurveyLoaded()==false){
    SL=setTimeout("startWork()",1000);
    return;
}
else{
    setTimeout("doMoreWork()",2000);
}
}

function isSurveyLoaded(){
    if(!parent.xsample){
        return false;
    }
    if(!parent.xsample.self.name){
        return false;
    }
    if(parent.xsample.document.readyState!='complete'){
        return false;
    }
    else{
        return true;
    }
}

Ответы [ 4 ]

1 голос
/ 25 апреля 2011

Используйте parent.frames["xsample"] для доступа к кадру.

Неявные ссылки на именованные элементы в объекте global не стандартизированы.

В другом примечании никогда не выполняйте setTimeout("doMoreWork(), 1000)", поскольку это заставляет виртуальную машину использовать eval для выполнения кода.
Используйте setTimeout(doMoreWork, 1000), который является правильным способом сделать это.

0 голосов
/ 07 апреля 2017

Чтобы обратиться к комментариям анти-frameset: Критика тех, кто использует фреймы, не отвечает на вопрос. Во-вторых, есть вещи, которые делают кадры лучше, чем любая другая альтернатива.

Таким образом, вопрос не должен звучать так: «Какой уважающий себя веб-разработчик использует наборы фреймов?» Должно быть: «Какой уважающий себя полнофункциональный браузер не поддерживает их должным образом?» и один из ответов, очевидно, Chrome.

Они разбросали «флаги безопасности» вокруг различных функций в своем интерпретаторе, включая те, которые облегчают передачу определенной информации между страницами в разных кадрах. Следовательно, подобные вещи не работают при локальном запуске:

top.frames [2] .document.getElementById (ID)

Однако при запуске на сервере он обычно работает нормально.

Если вам нужно, чтобы он работал локально в Chrome, вам нужно использовать какой-то обходной путь. Вы должны быть творческими. В некоторых случаях, например, когда вы знаете переменные ситуации, вы можете создать массив для обработки различных возможностей (в противном случае это перетаскивание, когда не нужно быть таким сложным).

0 голосов
/ 03 апреля 2015

В Chrome доступ к window.frames [index] дает вам объект Window, из которого вы можете получить доступ к хорошим вещам, таким как документ, внутри содержимого этого фрейма.

Доступ к нему с помощью document.getElementById возвращает только iframeсам элемент, почти без полезных атрибутов для дальнейшего углубления в DOM.

Эта ошибка, связанная с невозможностью доступа к объекту Window по его имени с помощью window.frames [name], как это делают другие браузеры, должно быть исправлено!

0 голосов
/ 25 апреля 2011

Я решил это:
1. Задание целевому фрейму как имени, так и идентификатора
2. тестирование для обоих
3. проверка того, что переменная (finishLoading) в целевом кадре была установлена ​​в значение true
(код изменен для использования === вместо == при тестировании окончания загрузки)

function isSurveyLoaded(){
  if(!(parent.frames["xsample"]  || parent.document.getElementById('xsample'))){
    return false;
  }
  else{
    if(parent.frames["xsample"]){
      target=parent.frames["xsample"];
    }
    else{
      target=parent.document.getElementById('xsample');
    }
  }
  if ((target.finishedLoading==='undefined') || (target.finishedLoading===false) ){
    return false;
  }
  else{
    return true;  
  }
}

Теперь упрощено с помощью

<frame src="doc.asp" onload="frameisloaded(this)" name="xsample" id="xsample" frameborder="no" marginwidth="15" marginheight="15">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...