Ожидание загрузки документа - сложная проблема, но вы хотите постоянно проверять наличие .ReadyState и .Busy (не забывайте об этом).Я дам вам некоторую общую информацию, которая вам понадобится, затем я отвечу на ваш конкретный вопрос в конце.
Кстати, NC = NavigateComplete и DC = DocumentComplete.
Кроме того, если выожидают наличия фреймов, вам нужно получить ссылку на них и проверить их .busy и .readystate, а если фреймы вложенные, то и вложенные фреймы .readystate и .busy, так что вам нужно написать функциюкоторый рекурсивно получает эти ссылки.
Теперь, независимо от того, сколько кадров у него есть, первое запущенное событие NC всегда является верхним документом, а последнее запущенное событие DC также всегда является событием верхнего (родительского) документа.
Таким образом, вы должны проверить, является ли это первый вызов, и pDisp Is WebBrowser1.object
(буквально это то, что вы вводите в своем операторе if), тогда вы знаете, что это NC для документа верхнего уровня, затем вы ждете того же самогообъект должен появиться в событии DC, поэтому сохраните pDisp в глобальной переменной и подождите, пока DC не будет запущен, а pDisp этого DC равен GlobalpDisp, который вы сохранили во время первого события NC (например, pDisp, который вы сохранили глобально в первом событии NC, которое сработало).Поэтому, как только вы узнаете, что pDisp был возвращен в контроллере домена, вы знаете, что весь документ завершил загрузку.
Это улучшит ваш метод currect, однако, чтобы сделать его более надежным, вам нужно выполнить проверку фреймовтакже, поскольку, даже если вы сделали все вышеперечисленное, это более чем на 90% хорошо, но не на 100% надежно, нужно сделать больше для этого.
Для успешного подсчета NC / DC в значимом значенииКстати (возможно, поверьте мне) вам нужно сохранить pDisp каждого NC в массиве или коллекции, если и только если он еще не существует в этом массиве / коллекции.Ключом к выполнению этой работы является проверка дубликата NC pDisp, а не добавление его, если он существует.Поскольку происходит то, что NC запускается с определенным URL, затем происходит перенаправление на стороне сервера или изменение URL, и когда это происходит, NC запускается снова, НО это происходит с тем же объектом pDisp, который использовался для старого URL.Таким образом, тот же объект pDisp отправляется во второе событие NC, которое происходит во второй раз с новым URL-адресом, но все еще выполняется с точно таким же объектом pDisp.
Теперь, поскольку у вас есть счетчик всех уникальныхNC pDisp объекты, вы можете (один за другим) удалять их при каждом событии DC, выполняя типичное сравнение If pDisp Is pDispArray(i) Then
(это в VB), заключенное в цикл For, и для каждого снятого счетчик вашего массива будетприблизиться к 0. Это точный способ сделать это, однако, одного этого недостаточно, так как другая пара NC / DC может появиться после того, как ваш счет достигнет 0. Кроме того, вы должны помнить, что нужно делать то же самое Для цикла L pDispпроверка в событии NavigateError, как и в событии DC, потому что при возникновении ошибки навигации происходит событие NavigateError ВМЕСТО события DC.
Я знаю, что это было много, но мне потребовалосьгоды, когда мне приходилось иметь дело с этим ужасным контролем, чтобы понять эти вещи, у меня есть другой код и методы, если вам нужно, но некоторые вещи, которые я упоминаюЗдесь, в связи с тем, что WB Navigation действительно готовы, ранее не публиковались в Интернете, поэтому я очень надеюсь, что вы найдете их полезными и дадите мне знать, как у вас дела.Кроме того, если вы хотите / нуждаетесь в разъяснениях по этому поводу, дайте мне знать, к сожалению, вышесказанное - это еще не все, если вы хотите быть на 100% уверены, что веб-страница загружена, ура.
PS: Такжезабыл упомянуть, что полагаться на URL-адреса для любого рода подсчета неточно, и это очень плохая идея, потому что несколько фреймов могут иметь один и тот же URL-адрес - например, на веб-сайте www.microsoft.com это делается как 3 фрейма илитак позвонив на основной сайт MS, который вы видите в адресной строке.Не используйте URL для любого метода подсчета.