weidagang2046的專欄

          物格而后知致
          隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
          數(shù)據(jù)加載中……

          Webbrowser控件判斷網(wǎng)頁加載完畢的簡單方法

          2007-03-04

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

          從微軟的官方網(wǎng)站上了解到,并非每個frame都對應了一個DocumentCompleted事件,只有觸發(fā)了DownloadBegin事件的frame才會有相應的DocumentCompleted事件。另外,最外層的frame總是最后觸發(fā)DocumentCompleted事件。DocumentCompleted事件具有一個IDispatch *類型的參數(shù),它指示了是在哪個frame上觸發(fā)的該事件。所以,要判斷文檔是否加載完畢,只需要判斷IDispatch *參數(shù)是否是Webbrowser控件的IDispatch。

          微軟support網(wǎng)站上關于這個問題的說明:
          http://support.microsoft.com/?scid=kb%3Ben-us%3B180366&x=9&y=14

          這個方法用到了COM相關的知識,在沒有現(xiàn)成代碼的情況下,對于像我這樣從.NET開始進入Windows平臺的程序員來講理解和實現(xiàn)起來都有一定的難度。尤其是.NET 2.0下的Webbrowser控件是對Webbrowser COM組件的不完全封裝,我在考察.NET 2.0 Webbrowser的WebBrowserDocumentCompletedEventArgs后并未發(fā)現(xiàn)有IDispatch參數(shù)或相關參數(shù)。不知道是不是在封裝過程中被省去了。

          希望哪位高手能告訴我如何用C#實現(xiàn)上面的方法,先在此謝過!不過,利用前面提到的最外層的frame總是最后觸發(fā)DocumentCompleted事件,還有一種更為簡單的方法:

          1. 引入一個計數(shù)器變量,初始值為0;
          2. 當Webbrowser控件的DownloadBegin (.NET 2.0中的Navigated)事件發(fā)生時對計數(shù)器加一;
          3. 當Webbrowser控件的DownloadCompleted事件發(fā)生時對計數(shù)器減一;
          4. 計數(shù)器減為0說明文檔加載完畢

          主要代碼:

          // 計數(shù)器
          int ?counter? = ? 0 ;



          // 添加事件響應函數(shù)

          this .webBrowser.Navigated? += ? new ?System.Windows.Forms.WebBrowserNavigatedEventHandler(webBrowser_Navigated);

          this .webBrowser.DocumentCompleted? += ? new ?System.Windows.Forms.WebBrowserDocumentCompletedEventHandler( this
          .webBrowser_DocumentCompleted);

          // 事件響應函數(shù)

          private ? void ?webBrowser_Navigated( object ?sender,?WebBrowserNavigatedEventArgs?e)
          {
          ????counter
          ++
          ;
          }


          private ? void ?webBrowser_DocumentCompleted( object ?sender,?WebBrowserDocumentCompletedEventArgs?e)
          {
          ????counter
          --
          ;

          ????
          if ?( 0 ? ==
          ?counter)
          ????
          {
          ?????
          // 加載完畢

          ????}

          }

          posted on 2007-03-04 22:10 weidagang2046 閱讀(28070) 評論(12)  編輯  收藏

          評論

          # re: Webbrowser控件判斷網(wǎng)頁加載完畢的簡單方法  回復  更多評論   

          謝謝,相當有幫助。
          2007-04-10 09:48 | calf

          # re: Webbrowser控件判斷網(wǎng)頁加載完畢的簡單方法  回復  更多評論   

          看樣子也是一位能人呀!
          2007-05-06 20:39 | QQ

          # re: Webbrowser控件判斷網(wǎng)頁加載完畢的簡單方法  回復  更多評論   

          看到一個方法
          是在DocumentCompleted事件中判斷e.Url和WebBrowser.Document.Url是否一致
          如一致則表示初始頁面加載完畢
          2007-07-11 14:45 | 鋼盅郭子

          # re: Webbrowser控件判斷網(wǎng)頁加載完畢的簡單方法  回復  更多評論   

          說錯了,應該是——
          判斷e.Url和WebBrowser.Document.Url
          2007-07-11 14:50 | 鋼盅郭子

          # re: Webbrowser控件判斷網(wǎng)頁加載完畢的簡單方法  回復  更多評論   

          if (e == wb1.ControlInterface) then
          ....
          2008-06-10 16:48 | shappy

          # re: Webbrowser控件判斷網(wǎng)頁加載完畢的簡單方法  回復  更多評論   

          如果頁面中有JS加載大量數(shù)據(jù)的話,判斷e.Url和WebBrowser.Document.Url 也不好使啊,怎么辦呢?
          2008-08-07 10:57 |

          # re: Webbrowser控件判斷網(wǎng)頁加載完畢的簡單方法  回復  更多評論   

          完全是胡扯
          2008-12-11 14:30 | 木木木木

          # re: Webbrowser控件判斷網(wǎng)頁加載完畢的簡單方法  回復  更多評論   

          有ifame,網(wǎng)址一樣好使嗎?
          2009-02-24 19:56 | 12222222

          # re: Webbrowser控件判斷網(wǎng)頁加載完畢的簡單方法  回復  更多評論   

          這些都是針對WebBrowser的。我是用網(wǎng)上下載的ExWebBrowser控件,結果刷新時,DocumentCompleted獲取不到事件,但如果里面有iframe,則DocumentCompleted響應的是iframe的,因我是動態(tài)加載iframe,所以DocumentCompleted事件獲取的e.url都是空,應該是此控件的問題,上述方法對此控件無效。針對此問題,采用一個簡單的計數(shù)器,做if/else判斷,然后通過 += 和 -= 來防止事件被注冊多次...
          2009-03-10 14:17 | TT

          # re: Webbrowser控件判斷網(wǎng)頁加載完畢的簡單方法  回復  更多評論   

          private void webBrowser_Navigated( object sender, WebBrowserNavigatedEventArgs e)
          {
          counter ++ ;
          }

          private void webBrowser_DocumentCompleted( object sender, WebBrowserDocumentCompletedEventArgs e)
          {
          counter -- ;

          if ( 0 == counter)
          {
          // 加載完畢
          }
          }

          事情總不是那么簡單。。。如果他是先執(zhí)行完webBrowser_Navigated 再執(zhí)行webBrowser_DocumentCompleted那就沒問題。。但事實好像不是這樣的。
          webBrowser_Navigated 執(zhí)行后
          就會執(zhí)行webBrowser_DocumentCompleted
          然后又執(zhí)行webBrowser_Navigated
          再執(zhí)行webBrowser_DocumentCompleted
          而去webBrowser_Navigated 的counter++最后未必等于
          webBrowser_DocumentCompleted 的counter--

          2010-04-20 23:51 | 不懂技術的路人甲

          # re: Webbrowser控件判斷網(wǎng)頁加載完畢的簡單方法  回復  更多評論   

          @鋼盅郭子
          很對 真的 這個 最好!!!
          2013-07-05 17:51 | 心碎烏托邦

          # re: Webbrowser控件判斷網(wǎng)頁加載完畢的簡單方法  回復  更多評論   

          有跳轉就不好事了。
          2013-12-21 09:59 | 孔凡星

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 馆陶县| 徐水县| 恭城| 汨罗市| 微山县| 庆元县| 剑川县| 英超| 淮北市| 嘉禾县| 枣强县| 和顺县| 兰考县| 岳池县| 墨脱县| 昌宁县| 西充县| 凤庆县| 蒙自县| 大渡口区| 呈贡县| 皋兰县| 呼图壁县| 万源市| 繁峙县| 苏尼特左旗| 田林县| 明水县| 内乡县| 赣榆县| 陇川县| 辽中县| 定安县| 尚义县| 宜昌市| 蒲城县| 汽车| 五家渠市| 蛟河市| 土默特左旗| 扎囊县|