Извлечение "фрейма самого высокого уровня" из элемента управления SHDocVw WebBrowser
Документация для события DocumentComplete упоминается ближе к концу:
В процессе загрузки фрейм самого высокого уровня, который не обязательно является фреймом верхнего уровня, запускает последнее событие DWebBrowserEvents2::DocumentComplete. В это время параметр pDisp совпадает с указателем интерфейса IDispatch кадра самого высокого уровня.
В чем разница между фреймом самого высокого уровня и фреймом верхнего уровня, и как я могу получить ссылку на фрейм самого высокого уровня?
2 ответа
Предположим, у вас есть веб-сайт с набором фреймов верхнего уровня, который содержит фрейм баннера сверху, фрейм меню слева и фрейм контента справа. Каждый элемент привязки во фрейме меню имеет целевой атрибут, установленный на фрейм контента. На каждой контентной странице есть несколько фреймов, которые будут целевыми страницами пунктов меню.
Теперь вы нажимаете на ссылку меню слева. Сам набор фреймов не меняется, как и фрейм меню. Единственный навигационный фрейм - это фрейм контента, фрейм самого высокого уровня в навигации.
Вы можете получить ссылку на навигационный фрейм самого высокого уровня из параметра первого события NavigateComplete2. IE затем анализирует фреймы на странице содержимого, чтобы узнать, есть ли дополнительные фреймы для загрузки. Дополнительные события NavigateComplete2 и DocumentComplete2 были вызваны, когда загружены остальные элементы iframe на странице содержимого, и, наконец, событие DocumentComplete2 вызывается для фрейма содержимого.
Если вы делаете это, чтобы проверить, действительно ли документ загружен, есть лучший способ проверить это конкретное событие (например, объекты 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).
Дайте мне знать, как это происходит, или если вам нужна дополнительная помощь.