C# 表单WeBrowser文档就绪事件。我如何知道所有Ajax调用何时完成?
我正在响应应用程序中的System.Windows.WebBrowser.DocumentComplete事件。但是,每次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
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字符串吗?只要您知道您正在隐式地创建对可靠良好的网络连接的依赖,这并不总是有保证的。