Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Получить содержимое iframe


Автор: inlanger 9.6.2008, 11:00
Помогите, пожалуйста, с решением такой проблемы...
Есть страница с ифреймом. Необходимо получить и обработать "на лету" содержимое этого ифрейма. Именно то содержимое, которое сейчас на экране у пользователя(то есть к серверу обращаться нельзя).

Единственное, что приходит в голову - вывести ифрейм на экран, с помощью javascript записать его содержимое в файл, в другом ифрейме через php получить содержимое файла и обработать...

В правмльном направлении я мыслю? И как это реализовать(javascript часть)?

Заранее огромное спасибо!

Автор: krundetz 9.6.2008, 11:43
Код

frames[0].document.body.innerHTML

Автор: inlanger 9.6.2008, 11:59
И куда это?
Я новичёк в javascript... Мне, пыхаписту, трудно понять этот код smile

Автор: krundetz 9.6.2008, 12:55
У вас есть iframe как я понял он у вас невидимый. В него загружена некая информация. Приведенный код вернет вам эту информацию. Тоесть содержимое.

Код

<script>
alert(frames[0].document.body.innerHTML);
</script>


Вставте этот код в канец вашего файла с iframe и поймете что он возвращает.

Автор: inlanger 9.6.2008, 13:02
Выскакивает пустой алерт...

Автор: krundetz 9.6.2008, 13:07
Значит либо у вас несколько iframe на странице или у вас туда ничего не подгружено изначально.

Автор: inlanger 9.6.2008, 13:11
Код

<iframe name=ifr id=ifr src=http://forum.vingrad.ru/forum/topic-215738.html></iframe>
 <script>
alert(frames[0].document.body.innerHTML);
</script>


и ничего вообще не происходит... 

з.ы. пустой алерт это я уже сам намудрил.

Автор: krundetz 9.6.2008, 22:58
Рекомендую ознакомится вот с этой статьей: http://www.kruglov.ru/articles/nontrivialjs/#iframe

Тоесть вот такой вариант:
Код

<iframe name=ifr id=ifr src=file.html></iframe>
 <script>
alert(frames[0].document.body.innerHTML);
</script>

будет работать при условие что file.html загружен с того же ресурса с которого загружен основной файл.

Добавлено @ 23:01
А вообще помоему вы хотите получить нечто готовое не прилогая усилий так какк все что я расказал не является какойто нетривиальной вешью и выдается в числе первых ссылок поисковыми системами по запросу iframe javascript. Сами же вы даже видимо ничего и не пробовали найти.

Автор: Ghirik 9.6.2008, 23:23
Например так

Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>name2</title>
<script type="text/javascript">
<!--
$fr = function(idIframe,mydiv) {
    if(/*@cc_on 1 | @*/0) {
        return document.getElementById(idIframe).contentWindow.document.getElementById(mydiv);
    }
    else{
        return document.getElementById(idIframe).contentDocument.getElementById(mydiv);
    }
}
//-->
</script>
</head>
<body>
<iframe id=I1 name=I1 style="display: none" src="index.htm" width="300" 
height="183">
</iframe>
<input type=button value=Узнать name=b1 onclick="alert($fr('I1','tab1').getAttribute('width'))">
</body>
</html>


Выдаст ширину таблицы (id=tab1) в фрейме I1

Добавлено через 2 минуты и 11 секунд
Если, конечно, в фрейме содержимое вашего сайта.

Автор: sergeyrg 4.4.2012, 14:50
а как быть если данные в ифрейме с другого домена, и уже пару форм отправлялось по посту, а мне 
нужно только считать инфу из него

а на любые попытки достучаться до контента фрейма
(типа var ifr=parent.window.frames['ifr'].document.getElementById('restable').innerHTML;)

 получаю примерно такой ответ: 
Ошибка: Permission denied to access property 'document'

:((((

Добавлено через 5 минут и 23 секунды
вот нарыл в инете мысль:

На своем домене сделать страницу-proxy. Т.е. по запросу к этой странице с параметром url — ваш серверный код (php, aspx, ...) будет слать запрос на указанный url и возвращать содержимое. Т.о. контент страницы любого url будет доступен с вашего домена. Теперь запрет на доступ к контенту снят, т.к. запрос на саму страницу и содержимое iframe — будут идти на один домен, что не является нарушением безопасности при попытке обращения через JS.
У данного решения существует ряд устранимых недостатков.

вопрос, как это сделать? да ещё так чтобы можно было форму по посту кинуть, и не просто форму, а с капчей заполненной.

мож кто примерчик кода такой прокси редиректилки покажет?

Добавлено через 8 минут и 31 секунду
только желательно без курла - ибо курл картинку капчи при эхе результата перерисовывает другую

Автор: sergeyrg 6.4.2012, 15:52
удалось кое что сделать немного нетривиально, используя временные файлы браузера, если у вас задача схожа с моей - может мой пост кому-то поможет.
(заранее извиняюсь если упоминание php и иже - офтоп)

у меня задача была такая: 
нужно было получать данные с чужого сайта, на каждый поиск вводилась капча; 
с помощью курла удалось только симитировать заполнение формы запроса, капчу не получилось подтверждать.
мне нужно было по-максимуму автоматизировать, т.к. на количество запросов около 1000 каждый клик усложняет задачу.

я сделал так:

на моей странице циклически перебираются поисковые запросы, каждый запрос выводит в ифрейме форму ввода капчи, я ввожу буковки с картинки, подтверждаю, потом в этом же ифрейме показывается результат поиска

за пределами ифрейма кнопочка которая просто перегружает страницу и уходит на следующий запрос.

каждая такая страница сама по себе сохраняется во временных файлах со всем контентом, включая содержимое ифрейма, с одинаковыми именами (это у меня в конкретной ситуации, может быть и по-другому) типа "имя_файла[1].htm","имя_файла[2].htm" и т.д. (я пользовал ИЕ, может в других браузерах по-другому)

мне остается только свалить это всё в отдельную папку, и отдельным перебрать в цикле и распарсить нужные мне данные.

рад если помог, мне самому даже мелкий совет иногда экономит недели работы.

Автор: Aliance 9.4.2012, 09:52
Ghirik, ну зачем же так сурово проверять метод получения ссылки на документ фрейма? Вот http://forum.vingrad.ru/index.php?showtopic=44559&view=findpost&p=355349 я предлагал более простое решение:
Код

function getFrameDocument (fram) {
 var d = (fram.contentDocument) ? fram.contentDocument : ((fram.contentWindow) ? fram.contentWindow.document : null);
 return d;
}

Автор: sergeyrg 9.4.2012, 10:10
я пробовал подобные схемы, но меня не пускает дальше .document ни ИЕ ни ФФ
на parent.window.frames['ifr'].document уже ошибка доступа, 
так же и на
..document.frames.ifr.document
..window.frames['ifr'].contentWindow
..document.getElementById("ifr").contentWindow
я пробовал эту дыру безопасности микрософта в ИЕ - не работает, и в ИЕ6 и в ИЕ7
доступа нет:
 "Отказано в доступе" в ИЕ
и
Permission denied to access property в ФФ

если есть рабочий пример, покажите плиз, мож я что не так делаю....


Автор: Aliance 9.4.2012, 13:58
Дай-ка догадаться, видимо ты пытаешься получить доступ к элементам фрейма с другого сервера?  smile 
http://forum.vingrad.ru/index.php?showtopic=44559&view=findpost&p=355349 я писал о невозможности такого действия:

Цитата

ЧЕГО ДЕЛАТЬ НЕЛЬЗЯ!!!
Получить доступ к свойствам документа из фреймов, доставленных с других серверов или домена. Политика безопастности не позволит данную операцию.

Автор: sergeyrg 9.4.2012, 18:26
про "нельзя" мне все поисковые сервера неделю шептали,
а мне "надо", и я нашел способ всё это обойти, кривовато - но свою задачу я выполнил ;)

Автор: Aliance 9.4.2012, 18:36
Дай-ка догадаюсь, only IE?  smile 

В любом случае, у нас принято делится найденным самостоятельно решением, кому-то может пригодится.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)