表格WeBbrowser文件就绪活动。我怎么知道所有Ajax调用何时完成?

时间:2010-08-19 20:55:29

标签: c# .net winforms webbrowser-control

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

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

5 个答案:

答案 0 :(得分:1)

脚本完成时没有触发事件(好吧,有IActiveScriptSite :: OnLeaveScript,但是你无法将自己的代码放到IE的脚本主机中)

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

您可能也希望覆盖InnerHTML和OuterHTML属性的setter方法。如果你想监视属性变化,比如css / directshow过渡,那么有太多的方法/属性可以挂钩而不会影响性能。

答案 1 :(得分:0)

如果您控制正在加载的站点,则可以创建一个脚本编写对象,可以在页面加载完成后从您的javascript调用。见WebBrowser.ObjectForScripting ....

编辑:每个OP评论。他不控制网站。

答案 2 :(得分:0)

您可以查看WebBrowserDocumentCompletedEventArgs的Url属性

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

我没有对ajax调用进行过测试,但它对iframe非常有用。

答案 3 :(得分:0)

经过多次搜索,追踪和错误后,我决定添加手动延迟。我简单地旋转一个工作线程,然后让这个踏板睡了几秒钟。这允许主ui工作,同时添加所需的延迟。

答案 4 :(得分:0)

正如其他人所说的那样,你可以注意到一个特定的事件。如果您知道要等待的特定元素,则可以等到该元素出现。 IE

while (element == null)
application.doevents

或者其他什么。但老实说,这真的是关于它的。如果你找到了更好的方法,请告诉我,因为我可以使用它。