如何在C#中使用WebBrowser控件DocumentCompleted事件?
在开始写这个问题之前,我试图解决以下问题
// 1. navigate to page// 2. wait until page is downloaded
// 3. read and write some data from/to iframe
// 4. submit (post) form
问题是,如果网页上存在iframe,则将触发DocumentCompleted事件,然后触发一次以上(在完成每个文档之后)。程序极有可能试图从DOM中读取未完成且自然发生的数据-
失败。
但是突然在写这个问题
激发了我,我解决了我试图解决的问题。由于我在Google上使用此工具失败,因此我认为将其发布在此处会很好。
private int iframe_counter = 1; // needs to be 1, to pass DCF test public bool isLazyMan = default(bool);
/// <summary>
/// LOCK to stop inspecting DOM before DCF
/// </summary>
public void waitPolice() {
while (isLazyMan) Application.DoEvents();
}
private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) {
if(!e.TargetFrameName.Equals(""))
iframe_counter --;
isLazyMan = true;
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
if (!((WebBrowser)sender).Document.Url.Equals(e.Url))
iframe_counter++;
if (((WebBrowser)sender).Document.Window.Frames.Count <= iframe_counter) {//DCF test
DocumentCompletedFully((WebBrowser)sender,e);
isLazyMan = false;
}
}
private void DocumentCompletedFully(WebBrowser sender, WebBrowserDocumentCompletedEventArgs e){
//code here
}
至少就目前而言,我的500万骇客似乎还不错。
也许我在查询Google或MSDN时确实失败了,但是我找不到:“如何在C#中使用Webbrowser控件DocumentCompleted事件?”
在学习了很多有关webcontrol的知识之后,我发现它确实具有FuNKY的功能。
即使您检测到该文档已完成,在大多数情况下,它也不会永远保持下去。页面更新可以通过几种方式完成-
帧刷新,诸如请求之类的Ajax或服务器端推送(您需要具有一些支持异步通信并具有html或JavaScript互操作的控件)。另外,某些iframe也永远不会加载,因此永远等待它们不是最好的主意。
我最终使用:
if (e.Url != wb.Url)
回答:
您可能还想知道AJAX调用。
考虑使用此:
private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e){
string url = e.Url.ToString();
if (!(url.StartsWith("http://") || url.StartsWith("https://")))
{
// in AJAX
}
if (e.Url.AbsolutePath != this.webBrowser.Url.AbsolutePath)
{
// IFRAME
}
else
{
// REAL DOCUMENT COMPLETE
}
}
以上是 如何在C#中使用WebBrowser控件DocumentCompleted事件? 的全部内容, 来源链接: utcz.com/qa/425557.html