Forms WeBrowser Document Ready событие.Как я узнаю, когда все вызовы Ajax завершены? - PullRequest
0 голосов
/ 20 августа 2010

Я отвечаю на событие System.Windows.WebBrowser.DocumentComplete в моем приложении. Однако это событие срабатывает каждый раз, когда на странице завершается вызов ajax. Я хотел бы знать, когда документ будет готов. Значение, когда все вызовы вернулись. Есть идеи?

void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
       {
           //Can fire many times if page has async calls.
       }

Ответы [ 5 ]

1 голос
/ 20 августа 2010

Нет события, которое вызывается, когда сценарии выполнены (ну, есть IActiveScriptSite :: OnLeaveScript, но вы не можете получить свой собственный код на хосте сценариев IE)

Я думаю, что вы можете использовать IDispatchEx, чтобы переопределить метод appendChild и метод removeChild для каждого узла DOM (или подключить события Mutation, если вы используете IE9) и внедрить вызов вашего кода (например, функцию IAmNotDoneYet) после вызова IE реализация этих методов. Исходные свойства и методы должны быть доступны через интерфейсы COM (например, IHTMLElement.AppendChild).

Возможно, вы также хотите переопределить метод установки для свойств InnerHTML и OuterHTML. Если вы хотите отслеживать изменения свойств, такие как переходы css / directshow, то существует слишком много методов / свойств, которые можно подключать без снижения производительности.

0 голосов
/ 25 августа 2010

Как все говорили, на самом деле не существует конкретного события, которое вы можете наблюдать.Если вы знаете, какой именно элемент вы ожидаете, вы можете подождать, пока этот элемент появится.IE

while (element == null)
application.doevents

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

0 голосов
/ 25 августа 2010

После долгих поисков, следов и ошибок я решил добавить ручную задержку. Я просто раскручиваю рабочий поток, а затем укладываю этот шаг на пару секунд. Это позволяет основному интерфейсу работать при добавлении необходимой задержки.

0 голосов
/ 20 августа 2010

Вы можете проверить свойство Url для WebBrowserDocumentCompletedEventArgs

if (!e.Url.AbsoluteUri.Contains(".js"))
    return;

Я не проверял это для вызовов ajax, но он очень хорошо работает для iframes.

0 голосов
/ 20 августа 2010

Если вы управляете загружаемым сайтом, вы можете создать объект для сценариев, который будет вызываться из вашего javascript, когда страница будет загружена.См. WebBrowser.ObjectForScripting ....

РЕДАКТ.Он не контролирует сайт.

...