C# 表单WeBrowser文档就绪事件。我如何知道所有Ajax调用何时完成?

C# 表单WeBrowser文档就绪事件。我如何知道所有Ajax调用何时完成?,c#,.net,winforms,webbrowser-control,C#,.net,Winforms,Webbrowser Control,我正在响应应用程序中的System.Windows.WebBrowser.DocumentComplete事件。但是,每次ajax调用在页面上完成时,都会触发此事件。我想知道文件什么时候准备好。意思是当所有呼叫都返回时。有什么想法吗 void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { //Can fire many times if

我正在响应应用程序中的System.Windows.WebBrowser.DocumentComplete事件。但是,每次ajax调用在页面上完成时,都会触发此事件。我想知道文件什么时候准备好。意思是当所有呼叫都返回时。有什么想法吗

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

如果控制正在加载的站点,则可以创建一个脚本对象,当页面加载完成时,可以从javascript调用该对象。看


编辑:每操作评论。他无法控制网站。

您可以检查WebBrowserDocumentCompletedEventArgs的Url属性

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

我还没有对ajax调用进行测试,但它在iFrame上运行得非常好。

脚本完成时没有触发事件(当然,有IActiveScriptSite::OnLeaveScript,但您无法将自己的代码放入IE的脚本主机)

我认为您可以使用IDispatchEx覆盖每个DOM节点的appendChild方法和removeChild方法(或者如果您在IE9上,则连接突变事件),并在调用IE对这些方法的实现后向代码注入调用(例如IAmNotDoneYet函数)。原始属性和方法应该可以通过COM接口访问(例如IHTMLElement.AppendChild)


您可能也希望覆盖InnerHTML和OuterHTML属性的setter方法。如果您想监视css/directshow转换之类的属性更改,那么有太多的方法/属性需要挂接而不会影响性能。

经过大量搜索、跟踪和错误,我决定添加一个手动延迟。我只是简单地旋转一根工作线,然后把这个踏板放在睡眠中几秒钟。这允许主ui在添加所需延迟的同时工作。

正如其他人所说的,实际上没有一个特定的事件可以观看。如果您知道要等待的特定元素,则可以等待该元素出现。即

while (element == null)
application.doevents

或者别的什么。但老实说,事情就是这样。如果你能找到更好的方法,请告诉我,因为我可以利用它。

哦,不。。我必须使用计时器吗?你是在假设我拥有这个页面。浏览器是嵌入Win Forms应用程序中的控件。你说得对。我是这样假设的。您是希望在向用户显示页面之前完全加载页面,还是在加载数据后需要对其执行某些操作?我希望能够知道文档何时完成加载。如果使用AJAX请求填充页面,那么上述事件会在每次访问页面时触发多次。这难道不足以说明*.js已经被拉下来了吗?这并不意味着ajax调用已经完成,对吗?这不仅仅是检查“.js”的uri字符串吗?只要您知道您正在隐式地创建对可靠良好的网络连接的依赖,这并不总是有保证的。