Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как достать перем. JS из IFRAME ? 
:(
    Опции темы
Ciber SLasH
  Дата 20.6.2005, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: 24
Всего: 67



Никак не получается достать массив из документа, загруженного в IFRAME. smile
Допустим есть 2 файла:
index.htm:
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content='text/html; charset=windows-1251' />
</head>

<body>
<iframe name="ifr" src='test.htm' width="100" height="100">Ваша бродилка не поддерживает IFRAME</iframe>
<script type='text/javascript'>
ifrm = document.getElementById('ifr');
ifr_cont = (ifrm.contentDocument) ? ifrm.contentDocument : ((ifrm.contentWindow) ? ifrm.contentWindow.document : null);
document.write(ifr_cont.scripts.length)
</script>
</body>
</html>

test.htm:
Код

<html>
<head>
<meta http-equiv="Content-Type" content='text/html; charset=windows-1251' />
<script id='jscode' type='text/javascript'>
mas = [1, 2];
</script>
</head>

<body>
111111
</body>
</html>

и вот как теперь из index.htm прочитать массив mas, который загружен в IFRAME ?
PM   Вверх
Black
Дата 20.6.2005, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Web-Development
**


Профиль
Группа: Участник
Сообщений: 980
Регистрация: 15.8.2004

Репутация: 4
Всего: 45



Ciber SLasH
может создать функцию в test.htm, которая возвращала бы массив???

Код

function massiv()
{
mas = [1, 2];
return mas;
}


А вызывать в index.htm так:

Код

NeedArray = parent.ifr.massiv();


В NeedArray массив smile

P.S: все писал от руки не проверял... поэтому могут быть ошикбки.


--------------------
Могу все, но ничего не умею :-)
PM WWW   Вверх
Ciber SLasH
Дата 21.6.2005, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: 24
Всего: 67



Поискав в сети инфу по запросу "contentDocument" наткнулся на статью, в которой говорится, что из документа, в котором есть IFRAME, не добраться до данных документа, загруженных в этот IFRAME.

Источник: http://www.kruglov.ru/articles/nontrivialjs/
PM   Вверх
Black
Дата 21.6.2005, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Web-Development
**


Профиль
Группа: Участник
Сообщений: 980
Регистрация: 15.8.2004

Репутация: 4
Всего: 45



Ciber SLasH
Почему нельзя, можно smile

Под ИЕ и Мозиллой нужно обращатся IFRAME.contentWindow.document.
Под Opera так: parent.IFRAME.document.
Где IFRAME - id фрейма.

Это сообщение отредактировал(а) PHP-DIRECTOR - 21.6.2005, 09:54


--------------------
Могу все, но ничего не умею :-)
PM WWW   Вверх
Black
Дата 21.6.2005, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Web-Development
**


Профиль
Группа: Участник
Сообщений: 980
Регистрация: 15.8.2004

Репутация: 4
Всего: 45



А Круглов человек странный он все еще считает что есть люди которые пользуются Оперой 5, 6. Вот в них возможно и нельзя.


--------------------
Могу все, но ничего не умею :-)
PM WWW   Вверх
Ciber SLasH
Дата 21.6.2005, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: 24
Всего: 67



Цитата(PHP @ 21.6.2005, 10:41)
Под ИЕ и Мозиллой нужно обращатся IFRAME.contentWindow.document.
Под Opera так: parent.IFRAME.document.
Где IFRAME - id фрейма.

Всё это я пробовал -- нифига не получилось.
Проведи эксперимент с поими 2-мя документами. smile
PM   Вверх
Black
Дата 21.6.2005, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Web-Development
**


Профиль
Группа: Участник
Сообщений: 980
Регистрация: 15.8.2004

Репутация: 4
Всего: 45



Код

<html>
<head>
<title>.: MAIN :.</title>

<script>
function lala()
{
document.getElementById('ifr').contentWindow.document.getElementById('text').value = "текст изменился";
}
</script>

</head>

<body>
<iframe id="ifr" src='lala4.html' width="100" height="100"></iframe>

<a href='javascript:lala();void(0);'>fff</a>
</body>

</html>



В lala4.html

Код


<html>
<head><title>.: IFRAME :.</title></head>
<body>
<input type='text' id='text' size='60' value='текст' />
</body></html>


Это сообщение отредактировал(а) PHP-DIRECTOR - 21.6.2005, 10:16


--------------------
Могу все, но ничего не умею :-)
PM WWW   Вверх
Black
Дата 21.6.2005, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Web-Development
**


Профиль
Группа: Участник
Сообщений: 980
Регистрация: 15.8.2004

Репутация: 4
Всего: 45



Кстати, данный пример работает и в новой Opere 8.01
Вероятно, сделали поддержку стандартного обращения.


--------------------
Могу все, но ничего не умею :-)
PM WWW   Вверх
Ciber SLasH
Дата 21.6.2005, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: 24
Всего: 67



2PHP-DIRECTOR:
Хм, я ведь делал тоже самое по сути, но у меня ничего не получалось.
Скорее всего из-за того, что я сразу пытался "достучаться" до содержимого IFRAME'а, а он ещё не успевал подгрузиться. Т.е. если ставить на кнопку функцию обработки, но всё ништяк. smile

10х, натолкнул на мысль... (с меня флюс smile)
PM   Вверх
Ciber SLasH
Дата 21.6.2005, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: 24
Всего: 67



Появилась кой-какая проблема.
В Firefox этот код не работает:

index.htm:
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content='text/html; charset=windows-1251' />
<title>MAIN</title>
<script type='text/javascript'>
/*** Инициализация необходимых переменных (и другое) ***/
function init() {
var ifrm = document.getElementById('ifr');
  ifrm_cont = (ifrm.contentDocument) ? ifrm.contentDocument : ((ifrm.contentWindow) ? ifrm.contentWindow.document : null);
var code = document.getElementById('jscode');
  logs = document.getElementById('msg');
  logs.innerHTML = 'IFRAME content is: "' + typeof(ifrm_cont) + '"';
var js = document.createElement('SCRIPT');
  js.type = 'text/javascript';
  js.text = ifrm_cont.scripts[0].text;
  code.appendChild(js);
}

/*** Запись в лог ***/
function log() {
  logs.innerHTML = ifrm_cont.scripts[0].text.replace(/\n/g, '<br>');
}

/*** Вставка кода в тело документа IFRAME-a ***/
function change() {
  ifrm_cont.body.innerHTML = 'random: ' + Math.random();
}
</script>
</head>

<body onLoad='init()'>
<center>
<iframe name="ifr" src='test.htm' width="250" height="100">Ваша бродилка не поддерживает IFRAME</iframe>
<p>
<a href='#' onClick='log(); return false'>Вывести содержимое скрипта IFRAME-а</a><br />
<a href='#' onClick='change(); return false'>Записать случайное число в тело документа, загруженного в IFRAME</a><br />
<a href='#' onClick='alert(MyFunc()); return false'>Возвратить значение функции из скрипта, находящегося в IFRAME-e</a><br />
<a href='#' onClick='logs.innerHTML = "<img src=" + img.src + " alt=" + img.alt + ">"; return false'>Показать рисунок, из переменной "img" в IFRAME-e</a>
</p>
</center>
<!-- Слой с логами -->
<div id='msg'></div>

<!-- Слой с JavaScript-ом, из IFRAME -->
<div id='jscode' style='display: none'></div>
</body>
</html>

test.htm:
Код

<html>
<head>
<meta http-equiv="Content-Type" content='text/html; charset=windows-1251' />
<script type='text/javascript'>
mas = [1, 2];

img = new Image();
img.src = 'http://local.ptron/html/black.gif';
img.alt = 'black';

function MyFunc() {
return 'IFRAME: return from "MyFunc"'
}
</script>
</head>

<body>
</body>
</html>

Как только загружается index.htm, должна показываться надпись: IFRAME content is: "...".
Проверял в IE и Opera -- здесь всё нормально, а вот Лису рогом упёрлась. smile
Как победить?
PM   Вверх
Black
Дата 21.6.2005, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Web-Development
**


Профиль
Группа: Участник
Сообщений: 980
Регистрация: 15.8.2004

Репутация: 4
Всего: 45



Ciber SLasH
ох ты мне и задачку дал :-)

Двадцать минут тупо смотрел на скрипт все ок... потом глянул на ифрейм и со стула упал

Цитата

<iframe name="ifr" src='test.htm' width="250" height="100">Ваша бродилка не поддерживает IFRAME</iframe>


замени на:

Цитата
<iframe id="ifr" src='test.htm' width="250" height="100">Ваша бродилка не поддерживает IFRAME</iframe>


Вот и весь прикол smile



--------------------
Могу все, но ничего не умею :-)
PM WWW   Вверх
Ciber SLasH
Дата 21.6.2005, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: 24
Всего: 67



Да, это я блин забыл исправить...
Исправил, но в Лисе по прежднему не работает. smile
PM   Вверх
Sardar
Дата 21.6.2005, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Ciber @ 21.6.2005, 05:54)
что из документа, в котором есть IFRAME, не добраться до данных документа, загруженных в этот IFRAME.

Нельзя переносить DOM ноды с одного документа в другой напрямую через appendChild, всё остальное можно и даже в "старых" браузерах.

Цитата(Ciber @ 21.6.2005, 19:11)
В Firefox этот код не работает:

Более страшного изврата я не видел smile

Смотрим и думаем почему это работает smile Подсказка: глобальным контекстом в скриптах всегдя являеться обьект window.
Код
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<meta http-equiv="Content-Type" content='text/html; charset=windows-1251' />
<script type='text/javascript'>
function takeVars() {
 var ifrm, ifr_cont;
 if((ifrm=document.getElementById('ifr'))==null) return;
 ifr_cont = (ifrm.contentWindow) ? ifrm.contentWindow : null;
 document.getElementById("tgt").innerHTML=ifr_cont? ifr_cont.mas.join(" - "): "unknown browser type";
}
</script>
</head>
<body>
<iframe id="ifr" src='test.htm' width="100" height="100" onload="takeVars();">Ваша бродилка не поддерживает IFRAME</iframe>
<div id="tgt" style="border: 1px solid navy; height: 20px; widht: 100%;"></div>
</body>
</html>


test.htm
Код
<html>
<head>
<meta http-equiv="Content-Type" content='text/html; charset=windows-1251' />
<script type='text/javascript'>
var mas = [1, 2];
</script>
</head>
<body>
111111
</body>
</html>



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Ciber SLasH
Дата 22.6.2005, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: 24
Всего: 67



2Sardar:
10х за пример smile
Твой пример работает в IE, Firefox, но не работает в Опере. smile

В Опере вот это: ifrm.contentWindow == undefined
в ней нужно через: ifrm.contentDocument

И появляется загвоздка с вызовом функции из IFRAME.
Вот так не пашет в Опере: ifrm_cont.MyFunc()
и так тоже: ifrm_cont.window.MyFunc()

Можно извратиться, чтобы работало во всех 3-х бродилках, но тогда нужно импортировать скрипт из IFRAME в главный документ:
Код

  code = document.getElementById('jscode');
  code.text = ifrm_cont.document.getElementById('ifr_js').text;

где элемент с ID='jscode' находится в главном документе:
Код

<script id='jscode' type='text/javascript'></script>

а элемент с ID='ifr_js' находится в документе IFRAME-a:
Код

<script id='ifr_js' type='text/javascript'>
function MyFunc() {
return 'IFRAME: return from "MyFunc"'
}
</script>


Может можно как-то без импорта скрипта обойтись, чтобы работало в этих 3-х бродилках ?
PM   Вверх
Sardar
Дата 22.6.2005, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Точно, в опере же не существует contentWindow... smile

Лучше не извращаться с текстом скриптов, а вызыват родительские функции из ифрейма: opener.takeValue(mas);


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0986 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.