2011-02-01 1 views
1

В документации DocumentComplete случае упоминает ближе к концу:Получение «высокий уровень» кадр из системы управления WebBrowser SHDocVw

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

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

ответ

2

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

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

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

+0

Спасибо за подробное объяснение.Полезно также и распространение сверху вниз и продвижение по пути вверх по документу. – ide

1

Если вы делаете это, чтобы проверить, действительно ли документ загружен, есть лучший способ проверить это событие (т. Е. Объекты 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).

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