c#,WebBrowser 判斷網頁是否載入完畢

來源:互聯網
上載者:User

private  void button1_Click(object sender, EventArgs e)

        {

            wb.Url = new Uri("http://www.baidu.com");

            wb.DocumentCompleted+=new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);

//這是給wb添載入入完畢的事件

        }

        private  void wb_DocumentCompleted(object sender, EventArgs e)//這個就是當網頁載入完畢後要進行的操作

        {

            richTextBox1.Text = wb.DocumentText;//輸出載入網頁的HTML代碼到文字框

        }

一般情況下,當ReadyState屬性變成READYSTATE_COMPLETE時,Webbrowser控制項會通過觸發DocumentCompleted事件來指示網頁載入完畢。但當載入的網頁包含frame時,可能會多次觸發該事件,所以不能簡單地通過它來判斷網頁載入完畢。

從微軟的官方網站上瞭解到,並非每個frame都對應了一個DocumentCompleted事件,只有觸發了DownloadBegin事件的frame才會有相應的DocumentCompleted事件。另外,最外層的frame總是最後觸發DocumentCompleted事件。DocumentCompleted事件具有一個IDispatch *類型的參數,它指示了是在哪個frame上觸發的該事件。所以,要判斷文檔是否載入完畢,只需要判斷IDispatch *參數是否是Webbrowser控制項的IDispatch.

-----------------------下文摘自msdn----------------------------------

WebBrowser 控制項觸發 DocumentComplete 事件的 ReadyState 屬性更改為 READYSTATE_COMPLETE 時。 這表示 WebBrowser 控制項已完成下載網頁。 以下是有關此事件的一些要點:
在帶有沒有架構頁的情況下 DocumentComplete 觸發一次所有完成後。
在多個的幀的情況下 DocumentComplete 擷取觸發多次。 並非每個架構將觸發此事件,但觸發 DownloadBegin 事件的每個架構將觸發相應的 DocumentComplete 事件。
DocumentComplete 事件有一個 IDispatch * 為參數是用於觸發 DocumentComplete 架構 (Shdocvw) 的 IDispatch。
頂級架構觸發最後 DocumentComplete。 以檢查是否不進行頁面下載,需要檢查 IDispatch * 參數是否與 WebBrowser 控制項的 IDispatch 相同。

對於 Visual Basic 以下是執行此檢查的代碼: Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object,
                                         URL As Variant)
   If (pDisp Is WebBrowser1.Object) Then
      Debug.Print "Web document is finished downloading"
   End If
End Sub

要處理 DocumentComplete 事件在 Visual C++ 中的,並確定網頁的下載是否完成,請執行這些步驟。

請注意您執行的步驟取決於使用 WebBrowser 控制項的方式。
如果要建立 WebBrowser 控制項 CWnd / CView 對象中,您必須執行步驟 1 至 4。
如果您 CDialog / CFormView 對象中建立 WebBrowser 控制項,只需要執行步驟 4。
如果您使用隨 Visual C++6.0 提供 CHtmlView 類,覆蓋 CHtmlView::DocumentComplete(),並按照步驟 4,使用 CHtmlView 類的該 m_pBrowserApp 成員訪問 WebBrowser 控制項。
在標頭檔為 CWnd / CView 衍生類別中定義 OnDocumentComplete 方法: afx_msg void OnDocumentComplete(LPDISPATCH lpDisp,
                                VARIANT FAR* URL);

聲明事件接收器在相同的標頭檔中: DECLARE_EVENTSINK_MAP()

在實現檔案 (.cpp) 為 CWnd / CView 衍生類別,實現事件接收器映射: BEGIN_EVENTSINK_MAP(CYourView, CView)
   ON_EVENT(CWBTstView, ID_WEB_BROWSE, 259 /* DocumentComplete */,
            OnDocumentComplete, VTS_DISPATCH VTS_PVARIANT)
END_EVENTSINK_MAP()

實現 OnDocumentComplete 方法: void CWBTstView::OnDocumentComplete(LPDISPATCH lpDisp,
                                    VARIANT FAR* URL)
{
   IUnknown*  pUnk;
   LPDISPATCH lpWBDisp;
   HRESULT    hr;

   pUnk = m_webBrowser.GetControlUnknown();
   ASSERT(pUnk);

   hr = pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);
   ASSERT(SUCCEEDED(hr));

   if (lpDisp == lpWBDisp )
   {
      // Top-level Window object, so document has been loaded
      TRACE("Web document is finished downloading\n");
   }

  lpWBDisp->Release();
}

WebBrowser 控制項定位到更改頂級架構的頁面時,此方法適用。 假設是否在導航發生本身,範圍內則觸發的最終 DocumentComplete 的圖文框與不頂層架構。 是例如請考慮如下情形。

WebBrowser 控制項承載一個框架組。 框架組的一個架構中, 使用者單擊一個連結將外框本身中開啟一個新的頁面,並使該框架組的其餘部分保持不變。 建立頁可能再次包含多個架構。 因此,會有多個 DocumentComplete 通知 (一個用於每個新的架構)。 但是,因為更改,頂級架構也不會發生最終 DocumentComplete 會的架構的已更改。

如果您感興趣檢查在這種情況下完成最終文檔,可以執行以下操作: 請檢查該 DocumentComplete 的 IDispatch 參數是否 IDispatch 參數的第一個 NavigateComplete2 事件相同。 因為第一個 NavigateComplete2 是頂級架構,而最後一個 DocumentComplete 還是頂層架構,執行這樣的方式比較將告訴是否完成頁下載。下面是一些樣本 C++ 代碼: LPDISPATCH glpDisp = NULL; // global LPDISPATCH, can also
                           // be of class scope

// NavigateComplete2 event
void CWebbrDlg::OnNavigateComplete2Explorer1(LPDISPATCH pDisp,
                                             VARIANT FAR* URL)
{
   // Check if glpDisp is NULL. If NULL, that means it is
   // the top level NavigateComplete2. Save the LPDISPATCH
   if (!glpDisp)
      glpDisp = pDisp;
}

void CWebbrDlg::OnDocumentCompleteExplorer1(LPDISPATCH pDisp,
                                            VARIANT FAR* URL)
{
   if (glpDisp && glpDisp == pDisp)
   {
      // if the LPDISPATCH are same, that means
      // it is the final DocumentComplete. Reset glpDisp
      TRACE("Document is done downloading");
      glpDisp = NULL;
   }
}

-------------------------------------------------------------------------------------------

  還有一個方法如下:

用Webbrowser控制項載入網頁時,通常會用DocumentCompleted事件來指示網頁載入完畢。但當載入的網頁包含frame時,可能會多次觸發該事件,所以不能簡單地通過它來判斷網頁載入完畢。要通過WebBrowserNavigatedEventArgs來判斷。

p rivate void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (e.Url != webBrowser1.Document.Url) return;
 
    // 當 e.Url == webBrowser1.Document.Url 我們要的網頁載入完畢
    // 載入完畢
    // ...
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.