Извлечение «фрейма самого высокого уровня» из элемента управления SHDocVw WebBrowser - PullRequest
1 голос
/ 02 февраля 2011

В документации для события DocumentComplete ближе к концу упоминается:

В процессе загрузки срабатывает фрейм самого высокого уровня, который не обязательно является фреймом верхнего уровня.последнее событие DWebBrowserEvents2 :: DocumentComplete.В настоящее время параметр pDisp совпадает с указателем интерфейса IDispatch для фрейма самого высокого уровня.

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

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

Предположим, у вас есть веб-сайт с набором фреймов верхнего уровня, который содержит фрейм баннера сверху, фрейм меню слева и фрейм контента справа.Каждый элемент привязки во фрейме меню имеет целевой атрибут, установленный на фрейм контента.На каждой контентной странице есть несколько фреймов, которые будут целевыми страницами пунктов меню.

Теперь вы нажимаете ссылку меню слева.Сам набор фреймов не меняется, как и фрейм меню.Единственный навигационный фрейм - это фрейм контента, фрейм самого высокого уровня в навигации.

Вы можете получить ссылку на навигационный фрейм самого высокого уровня из параметра первого события NavigateComplete2.IE затем анализирует фреймы на странице содержимого, чтобы узнать, есть ли дополнительные фреймы для загрузки.Дополнительные события NavigateComplete2 и DocumentComplete2 были вызваны при загрузке остальных элементов iframe на странице содержимого, и, наконец, событие DocumentComplete2 вызывается для фрейма содержимого.

1 голос
/ 18 марта 2012

, если вы делаете это, чтобы проверить, действительно ли документ загружен, есть лучший способ проверить это конкретное событие (например, объекты pDisp).Посмотрите на некоторые из моих ответов, связанных с управлением веб-браузером.

, поэтому здесь вы хотите запустить счетчик различий между NavComplete и DocComplete, однако, если вы сделаете это нормально, он не будет работать, так как NavComplete вызываетсяболее одного раза на многих кадрах, поэтому вам необходимо проверить, является ли вызываемый NavComplete уникальным.В vb это просто сравнение одного объекта с другим с помощью оператора Is, в C # я понимаю, что Is недоступно, поэтому вы просто делаете обычное сравнение объектов.

Итак, вы ведете список всех объектов pDisp, которыеNavComplete опубликовал, и перед добавлением каждого вы проверяете всю коллекцию, чтобы убедиться, что добавляемый pDisp ранее не был добавлен (т. Е. Уникален), например: If pDisp Is pDispCollection(i) Then и «i» - ваш счетчик приращений в вашемдля каждого цикла.

Теперь сообщения pDisp, которые публикуются в DocComplete, ВСЕГДА уникальны (поэтому вам не нужно беспокоиться о том, что он вызывается более одного раза для каждого нового / уникального pDisp), поэтому каждый раз, когда происходит pDisp, выпросто найдите, какой это из коллекции, и удалите его.

Как только вы достигнете 0, вы узнаете, что он действительно завершен:).

Есть и другие вещи, которые вам нужно проверитьно это очень важный вопрос, который значительно увеличит вашу точность (гораздо больше, чем просто проверка на .busy и .readystate).

Дайте мне знать, как это происходитЕсли вам нужна дополнительная помощь.

...