Как получить содержимое фрейма
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Как получить содержимое фрейма Expand / Collapse
Автор
Сообщение
07.02.2004 2:43
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 14.02.2004 15:15
Сообщ.: 12, Visits: 133
из контрола WebBrowser?
Пробовал WebBrowser1.Document.frames(0).Document.documentElement.innerHTML,
не помогает: access denied... При этом элемент frames(0) точно есть.
Сообщ. #809335
09.02.2004 11:49


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 13.12.2007 18:51
Сообщ.: 3 047, Visits: 33 391
Странно.
Вот такой код работает:

Private Sub Form_Load()
WebBrowser1.Navigate "http://mopsclassika.narod.ru/index.html"
Do Until WebBrowser1.ReadyState = READYSTATE_COMPLETE
DoEvents
Loop
Debug.Print WebBrowser1.Document.frames(0).Document.documentElement.innerHTML
End Sub

(нашёл в Сети какую-то страничку с фреймами - на Narod.Ru)

Но если не дождаться окончания загрузки странички, то ругань будет - правда, не про "access denied", а "Object variable or With block variable not set", т.к. WebBrowser1.Document не существует, пока окончательно не загрузится.

ВРОДЕ БЫ (но я не уверен) ваша ошибка бывает, когда в фрейме есть ссылка на другой домен...



While (!Life.EOF) { You.Money ++; You.Girls.Add(new Girl(90,60,90)); BeHappy(); }
Сообщ. #809461
10.02.2004 13:38


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 13.12.2007 18:51
Сообщ.: 3 047, Visits: 33 391
Да, тут ничего не поделаешь - это специальная политика MS по обеспечению "cross-frame security" (см. MSDN). Когда вышеприведённый код "споткнётся" на строчке "Debug.Print ..." с ошибкой "Access denied", не останавливайте выполнение кода, а выберите "Debug", включите отображение окна "Watches", затем в той строчке выделите "WebBrowser1.Document.frames(0)" и перетащите его мышью в окно "Watches". Затем разверните "плюсик", чтобы увидеть объектную модель этого "WebBrowser1.Document.frames(0)" - и вы увидите, что там практически на всех элементах будет "Access denied" или "Permission denied".

Наверное, есть только один выход:
st = WebBrowser1.Document.body.innerHTML
затем - обычный текстовый парсинг для выделения из st куска, заключённого между <FRAMESET> и </FRAMESET>, и так далее...



While (!Life.EOF) { You.Money ++; You.Girls.Add(new Girl(90,60,90)); BeHappy(); }
Сообщ. #809584
11.02.2004 4:29
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 14.02.2004 15:15
Сообщ.: 12, Visits: 133
Хороший метод изучить объектную модель :))) Я и не знал, что так можно :)
Попробовал изменить WebBrowser1.Document.domain, чтобы обойти "cross-frame..." - не получается, хотя нигде и не написано, что он read only :(

>текстовый парсинг куска, заключённого между <FRAMESET> и </FRAMESET>, и так далее...
А что "и так далее"? Содержимого фреймов там же все равно нет, только ссылки... А по новой скачивать не хочется, хотя, в принципе, это выход. Еще один выход - в кэше поискать... Но хотелось бы покрасивше сделать. :) Да и возни много с кэшем...

Но интересно вот что: при клике правой кнопкой в области фрейма "Просмотр в виде HTML" открывается блокнот с содержимым фрейма. Как-то же он это делает, откуда-то же берет это содержимое, как-то оно передается... Интересно, как?... Может быть, через OLE можно? Только как?
Сообщ. #809668
11.02.2004 9:22
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 07.04.2005 12:23
Сообщ.: 193, Visits: 2 124
Как-то приходилось решать подобную задачу, но там HTML-код был "правильным" и я открывал его как XML без DTD, затем getElementsByTagName получал коллекцию нужных мне элементов (для данного случая "FRAMESET"). Потом брал .xml (точно не помню, входят ли строки "<FRAMESET>" и "</FRAMESET>" в это свойство, но отсечь-то их не трудно) для каждого узла и спокойно загружал его в WebBrowser. Хотя быстродействие и не требовалось, код получился достаточно шустрый.
Сообщ. #809682
11.02.2004 9:42
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 07.04.2005 12:23
Сообщ.: 193, Visits: 2 124
2 Comanche
Приведенный тобой код у меня работает. И в Watch всё OK!
Интересные тараканы :)
Сообщ. #809684
11.02.2004 10:37


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 13.12.2007 18:51
Сообщ.: 3 047, Visits: 33 391
2t-80:
А ты открой в Блокноте эту htm-страничку про мопсов и во всех трёх фреймах (чтоб наверняка :)) ) измени SRC на http://www.rambler.ru, http://www.mail.ru и т.п. Сохрани, и уже после этого посмотри, что у тебя будет в Watches!

Так что тараканов тут нет. Есть cross-frame security, а это похлеще будет ;-)



While (!Life.EOF) { You.Money ++; You.Girls.Add(new Girl(90,60,90)); BeHappy(); }
Сообщ. #809692
11.02.2004 14:08
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 07.04.2005 12:23
Сообщ.: 193, Visits: 2 124
Прошу прощения что невнимательно читаю.
Кроме текстового парисинга можно попробовать поискать элементы FRAMESET, FRAME... и в атрибутах каждого найденного поискать атрибут "SRC"... ", и так далее" :))) Работать через DOM будет медленней, чем работа со строками (зато понтов больше:)!), но полезно попробовать и так и эдак :)) Все что выше, считать ИМХО :))
Сообщ. #809721