日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

谨慎注意WebBrowser控件的DocumentCompleted事件

發(fā)布時間:2024/9/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 谨慎注意WebBrowser控件的DocumentCompleted事件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

引言

WebBrowser控件的DocumentCompleted事件一般就被認定為是在頁面完全加載完畢后產生,而注釋中也是這么寫的:

但事實卻并非如此。

首先它不一定會在完全加載完畢時才觸發(fā),有時就會在加載過程中就會觸發(fā)。

其次按照“完全加載完畢后”來理解,會認為通常一次頁面跳轉只會引發(fā)一次該事件,事實也并非如此,某些頁面加載時會引發(fā)十多次乃至更多。

試驗

做一個簡單試驗,首先設計這樣的界面:

然后為那個轉到按鈕添加單擊事件處理:

private?void?button1_Click(object?sender,?EventArgs?e)

{

????webBrowser1.Navigate(textBox1.Text);

}

再為WebBrowser控件的DocumentCompleted事件添加處理:

private?void?webBrowser1_DocumentCompleted(object?sender,?WebBrowserDocumentCompletedEventArgs?e)

{

????listBox1.Items.Insert(0, webBrowser1.ReadyState);

}

在這里就是輸出WebBrowser控件的ReadyState屬性到列表中。

運行并測試:

可以看到加載某些頁面時會引發(fā)很多次該事件,并且狀態(tài)都是一連串的Interactive。

究其原因是與頁面復雜度有關的,猜想是因iFrame或Ajax加載完畢而觸發(fā)的。

而觸發(fā)DocumentCompleted事件時ReadyState為Complete的情況通常只在每次加載頁面時出現(xiàn)一次,所以這時我們才應認為其已完全加載。但也并非一個頁面100%只會出現(xiàn)一次這種情況,比如頁面中Google的“更多”鏈接點擊后僅僅是彈出一個列表,但這時又會出現(xiàn)一次Complete。

這會導致什么問題?

假如在ReadyState為Interactive甚至是Loading時對頁面實施操控,那很可能無效或引發(fā)異常。

而假如忽視這種一頁多發(fā)事件的情況,會導致大量重復操作,從而引發(fā)異常或邏輯問題。

該如何解決?

以下代碼可以確保你不會在未加載完畢時執(zhí)行操作:

private?void?webBrowser1_DocumentCompleted(object?sender,?WebBrowserDocumentCompletedEventArgs?e)

{

????if?(webBrowser1.ReadyState?<?WebBrowserReadyState.Complete)?return;

????//執(zhí)行正常流程代碼…………

}

如果需要嚴格控制每頁只能執(zhí)行一次代碼,那么需要附加一個屬性或變量來記錄上次訪問的網(wǎng)址,并據(jù)此進行判斷:

private?void?webBrowser1_DocumentCompleted(object?sender,?WebBrowserDocumentCompletedEventArgs?e)

{

????if?(webBrowser1.ReadyState?<?WebBrowserReadyState.Complete?||?webBrowser1.Url.ToString()?==?LastUrl)?return;

????LastUrl?=?webBrowser1.Url.ToString();

????//執(zhí)行正常流程代碼…………

}

public?string?LastUrl

{

????get

????{

????????return?_LastUrl;

????}

????set

????{

????????_LastUrl?=?value;

????}

}

private?string?_LastUrl;

結語

WebBrowser是非常實用的控件,但也可說是粗制濫造的典范,各種問題層出不窮,從注釋對不上實際功能這一點來看,就知道開發(fā)者多么漫不經心了。還有就是ReadyState屬性其實是一個非常關鍵的屬性,而開發(fā)者卻沒有設置一個事件來監(jiān)控其狀態(tài)變更,真是太失敗了。

總結

以上是生活随笔為你收集整理的谨慎注意WebBrowser控件的DocumentCompleted事件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。