我正在响应应用程序中的System.Windows.WebBrowser.DocumentComplete事件。但是,每次在页面上完成ajax调用时,都会触发此事件。我想知道文件什么时候准备好了。所有呼叫都返回时的含义。有什么想法吗?
void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
//Can fire many times if page has async calls.
}
答案 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
或者其他什么。但老实说,这真的是关于它的。如果你找到了更好的方法,请告诉我,因为我可以使用它。