none
C#-webbrowser第一个页面跳转到第二个页面,判断第二个页是否加载完毕? RRS feed

  • 问题

  • C#-webbrowser如何判断第一个页面跳转到第二个页面,判断第二个页是否加载完毕?

    在DocumentCompleted该事件中添加了

     if (WebBrowser1.ReadyState == WebBrowserReadyState.Complete)

     if (e.Url.LocalPath.ToString() == "/t1/index.asp")  //第一个页的判断

    只对第一个页面有效,

     

     else if (e.Url.LocalPath.ToString() == "/t1/thankyou.asp" && WebBrowser1.StatusText == "Done") //第二个页面的判断

    第一个页面可以用WebBrowser1_DocumentComplete判断,但是在第一个页面跳转到第二个页面的时候,如何判断第二个页面是否加载完毕?

    我估计这些属性第一个页被赋值,所以第二个页就判断不准,哈哈。这是我猜的,请高手帮忙,非常感谢

    2011年1月3日 8:49

答案

  • Hi 夜雨清风,

    欢迎使用MSDN论坛,期待您能够在提高自我的同时为社区做出贡献。


    如果我没有理解错你的意思,你是想在WebBrowser每次跳转时,在页面完全加载完之后判断已经加载的是哪个页面,并对不同的页面做不同的操作,对不对?


    如果是这样的话,首先请看MSDNWebBrowser.DocumentCompleted事件的详细说明,这个事件是在页面文档全部下载完成之后执行的,在WebBrowser中每次页面跳转之后,在新页面加载完成时都会执行,而相关属性(Url DocumentText )的值都会更新,并不存在“第一个页被赋值,所以第二个页就判断不准”的问题。


    一般情况下,当
    ReadyState属性变成WebBrowserReadyState.Complete时,Webbrowser件会通过触发DocumentCompleted件来指示网页加载完毕。但当加载的网页包含多个框架页时,可能会多次触发该事件,所以不能简单地通过它来判断网页加载完毕。每个框架页触发该事件时WebBrowserDocumentCompletedEventArgs.URL是不一样的,最外层框架页是最后触发的,而它的URL正是整个页面的URL,所以我们可以通过判断多次回发的URL是否和页面URL一致来判断页面是否最终加载完成


    首先我们做个测试看看框架页载入时是不是会多次触发DocumentCompleted事件:
    创建一个新的Windows窗体应用程序,添加一个WebBrowser控件,将初始页面设定为Google(http://http://www.google.com.hk/),添加DocumentCompleted事件如下:

     //========================================================================
     private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
     {
     MessageBox.Show("这是e.Url:\n" + e.Url +
         "\n这是webBrowser1.Document.Url:\n" + webBrowser1.Document.Url);
     }
     //========================================================================

     

       运行之后首先会弹框如下,一切正常,因为首页没有框架页。


    在页面上点“地图”链接之后:


    会在新页面载入时触发俩次
    DocumentCompleted事件,先后弹出提示窗口如下:




    我们来查看一下此页的源代码,会发现存在一个iFrame框架页:


    所以你可以依照下面简单样例来对你的程序进行测试:

     //=======================================================================
     private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
     {
       // Use this way to decide if the whole page document has been completely downloaded.
       if (e.Url == webBrowser1.Document.Url)
       {
         if (e.Url.LocalPath == "/t1/index.asp")
         {
           // Do sth.
         }
         else if (e.Url.LocalPath == "/t1/thankyou.asp")
         {
           // Do some other things.
         }
       }
     }
     //=======================================================================

    如果我的解释有什么不清楚的地方请及时告诉我,谢谢。

    Sincerely,

    Leo Liu
    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年1月8日 8:41
    版主

全部回复

  • 我知道这是为什么了。

    因为这个事件(DocumentComplete)是异步的

    要改成同步的,请高手帮忙了。5555555

    2011年1月4日 8:15
  • Hi 夜雨清风,

    欢迎使用MSDN论坛,期待您能够在提高自我的同时为社区做出贡献。


    如果我没有理解错你的意思,你是想在WebBrowser每次跳转时,在页面完全加载完之后判断已经加载的是哪个页面,并对不同的页面做不同的操作,对不对?


    如果是这样的话,首先请看MSDNWebBrowser.DocumentCompleted事件的详细说明,这个事件是在页面文档全部下载完成之后执行的,在WebBrowser中每次页面跳转之后,在新页面加载完成时都会执行,而相关属性(Url DocumentText )的值都会更新,并不存在“第一个页被赋值,所以第二个页就判断不准”的问题。


    一般情况下,当
    ReadyState属性变成WebBrowserReadyState.Complete时,Webbrowser件会通过触发DocumentCompleted件来指示网页加载完毕。但当加载的网页包含多个框架页时,可能会多次触发该事件,所以不能简单地通过它来判断网页加载完毕。每个框架页触发该事件时WebBrowserDocumentCompletedEventArgs.URL是不一样的,最外层框架页是最后触发的,而它的URL正是整个页面的URL,所以我们可以通过判断多次回发的URL是否和页面URL一致来判断页面是否最终加载完成


    首先我们做个测试看看框架页载入时是不是会多次触发DocumentCompleted事件:
    创建一个新的Windows窗体应用程序,添加一个WebBrowser控件,将初始页面设定为Google(http://http://www.google.com.hk/),添加DocumentCompleted事件如下:

     //========================================================================
     private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
     {
     MessageBox.Show("这是e.Url:\n" + e.Url +
         "\n这是webBrowser1.Document.Url:\n" + webBrowser1.Document.Url);
     }
     //========================================================================

     

       运行之后首先会弹框如下,一切正常,因为首页没有框架页。


    在页面上点“地图”链接之后:


    会在新页面载入时触发俩次
    DocumentCompleted事件,先后弹出提示窗口如下:




    我们来查看一下此页的源代码,会发现存在一个iFrame框架页:


    所以你可以依照下面简单样例来对你的程序进行测试:

     //=======================================================================
     private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
     {
       // Use this way to decide if the whole page document has been completely downloaded.
       if (e.Url == webBrowser1.Document.Url)
       {
         if (e.Url.LocalPath == "/t1/index.asp")
         {
           // Do sth.
         }
         else if (e.Url.LocalPath == "/t1/thankyou.asp")
         {
           // Do some other things.
         }
       }
     }
     //=======================================================================

    如果我的解释有什么不清楚的地方请及时告诉我,谢谢。

    Sincerely,

    Leo Liu
    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年1月8日 8:41
    版主
  • 谢谢,正用得上。

    2013年5月26日 12:32