2011-03-23 25 views
2

我使用的是Visual C#Express 2010(.NET Framework 4.0),Windows 7 32bit。如何使HTMLDocumentEvent onclick多次啓動?

我創建了WinForm項目,它只有WebBrowser控件和ListItem對象,通過onclick事件顯示html信息。

我的目標是要運行的項目,然後單擊文本框在網站WebBrowser控件和顯示已經被點擊(如文本字段標籤等)

代碼

html文件信息
namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 

     private mshtml.HTMLDocument doc = null; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
     object oUrl = "http://livemocha.com/"; 
     object oEmpty = ""; 
     myBrowser.Navigate(oUrl.ToString()); 

     } 


     private void myBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      try 
      { 
       doc = (mshtml.HTMLDocument)myBrowser.Document.DomDocument; 
       mshtml.HTMLDocumentEvents2_Event iEvent = (mshtml.HTMLDocumentEvents2_Event)doc; 

       iEvent.onclick += new HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler); 

      } 
      catch (UnauthorizedAccessException err) 
      { 
       Console.WriteLine("OOPS: " + err); 
      } 

     } 

     //event handler when user clicks mouse 
     //and just display info such as html tag and its attributes 
     private bool ClickEventHandler(mshtml.IHTMLEventObj e) 
     { 
      actionList.Items.Add("------- ClickEventHandler -----------"); 

      actionList.Items.Add(e.type + " : " + e.srcElement.tagName + " : " + e.srcElement.outerHTML + " : " + e.srcElement.innerText + " : " + e.srcElement.id); 

      return true; 
     } 
    }//end class 
}//end namespace 

問題出在工作時,ListItem對象顯示ClickEventHandler生成的相同輸出。例如,如果我訪問www.google.com,只需鼠標點擊搜索文本字段,則輸出爲:

----- ClickEventHandler --------- 
click: INPUT <INPUT style=..... 
----- ClickEventHandler --------- 
click: INPUT <INPUT style=..... 
----- ClickEventHandler --------- 
click: INPUT <INPUT style=..... 

等等。點擊事件被多次觸發。

我已經按照這裏的例子:多次 http://support.microsoft.com/kb/312777

我想myBrowser_DocumentCompleted()被調用以某種方式與該行添加相同的事件處理程序,

iEvent.onclick += new HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler); 

但HTMLDocumentEvents2_Event方法類似的onclick ()只接受+ =- =所以我不能真的改變這一行。

有沒有人遇到過這個?

UPDATE

想通WebBrowser控件URL初始設置爲www.msn.com和項目運行時,documentCompleted事件稱爲一次它增加點擊事件處理程序。

然後導航到另一個URL添加單擊事件處理程序的FormLoad()事件。

所以現在有2個點擊事件處理程序存在。

此外,每當我去到不同的URL,不知何故點擊事件處理程序正在添加。

所以我很確定裏面的documentCompleted() eventiEvent沒有正確清除。(通過查看代碼,它是通過documentCompleted()事件初始化的,所以它不應該有這種行爲,儘管...)

+0

看起來這其中的Form_Load導航到另一個站點可能會添加重複的事件處理程序...? – 2011-03-23 02:08:06

+0

算了一下,首先, form_load指向我另一個網站是添加重複的點擊事件處理程序,但即使沒有它,它仍然添加事件處理程序,因爲一些不正確的內部文檔完成事件處理程序。看起來像代碼是好的雖然..hmm – 2011-03-23 02:28:19

回答

4

用了一段時間之後,我想,每次頁面,而不管重新加載到URL,觸發documentCompleted()事件並將相同的clickEvent()添加到iEvent。

解決方法是檢查doc是否爲空。

private void myBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      try 
      { 
       if (doc == null) 
       { 
        doc = (mshtml.HTMLDocument)myBrowser.Document.DomDocument; 
        mshtml.HTMLDocumentEvents2_Event iEvent = (mshtml.HTMLDocumentEvents2_Event)doc; 

        iEvent.onclick += new HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler); 
        iEvent.onkeypress += new HTMLDocumentEvents2_onkeypressEventHandler(KeyStrokeEventHandler); 
       } 
      } 
      catch (UnauthorizedAccessException err) 
      { 
       Console.WriteLine("OOPS: " + err); 
      } 
     } 

我不相信這是最好的解決方案,但現在這個作品。 (雖然還是不知道爲什麼它被添加clickEvent即使iEvent每被重新初始化documentCompleted()通話。

+0

感謝您發佈此信息。我看過其他代碼示例中的空檢查,但不知道它爲什麼在那裏。 – gb2d 2011-07-26 18:40:33

+0

相當古老的線程,但@ masato-san謝謝。我花了幾個小時挖掘相同的問題(C++)。由於多個框架(或dhtml),只要「一些」內容準備好顯示,DocumentComplete就會被多次觸發。因此,在DocumentComplete內部訂閱的更多事件會瘋狂地增加:) – user1797147 2015-05-23 21:47:29

2

調試它,在事件處理程序上設置一個斷點。這很可能,儘管我不能在你的問題中重複使用網站。 DocumentCompleted爲網頁中的每個框架啓動,可能會有多個。從使用布爾字段以跟蹤你已經訂閱的情況下短,你也可以過濾掉幀像這樣:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { 
     if (e.Url != webBrowser1.Url) return; 
     // etc.. 
    } 
+0

我完全忘了關於調試器!thx我會嘗試一下。 – 2011-03-23 02:40:58

+0

我對調試器不熟悉,但是當我使用它時,每次觸發documentCompleted()時,iEvent都會首先設置爲null,直到它被分配,所以它不應該加起來重複點擊事件..嗯,我會嘗試過濾 – 2011-03-23 02:48:26