2016-11-29 25 views
0

我想讓我的瀏覽器(GeckoFX)在我的網頁上點擊一個按鈕時執行一個.NET函數。我有以下代碼:GeckoFX上的'AddMessageEventListener'錯誤

public Form1() 
{ 
    InitializeComponent(); 

    AddMessageEventListener("myFunction", ((string s) => this.showMessage(s))); 

    browser.LoadHtml 
    (
     @"<!DOCTYPE html> 
      <html><head> 
      <meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8""> 
      <script type=""text/javascript""> 
       function fireEvent(name, data) 
       { 
        event = document.createEvent('MessageEvent'); 
        event.initMessageEvent(name, false, false, data, null, null, null, null); 
        document.dispatchEvent(event); 
       } 
      </script> 
      </head> 
      <body>fdsfsda 
       <input type=""button"" onclick=""fireEvent('myFunction', 'some data');"" value=""SHOW DATA"" /> 
      </body></html>" 
    ); 
} 

public void AddMessageEventListener(string eventName, Action<string> action) 
{ 
    browser.AddMessageEventListener(eventName, action); 
} 

private void showMessage(string s) 
{ 
    MessageBox.Show(s); 
} 

但運行的代碼,行

browser.AddMessageEventListener(eventName, action); 

時給我錯誤的「不設置到對象的實例對象引用」。我不明白,因爲我已檢查該行中的所有對象都已初始化。有人可以幫助,並告訴我爲什麼我得到這個錯誤?

非常感謝!

+0

有人能幫助我嗎?這讓我瘋狂!非常感謝你!!!!!!! – jaume

+0

您的代碼是否輸入了「AddMessageEventListener」方法? – Bartosz

回答

0

您可以嘗試不同的方法。 訂閱browser.DomClick事件 - 無論什麼時候點擊,它都會被觸發。從那裏你可以過濾出無趣的點擊,只有當你想要的元素被點擊時纔會調用進一步的代碼。

Browser.DomClick += browser_DomClick; 

然後

private void browser_DomClick(object sender, DomMouseEventArgs e) 
     { 
      var browser = sender as GeckoWebBrowser; 

      if (sender != null && e != null && e.Target != null) 
      { 
       if (e.Button == GeckoMouseButton.Left) 
       { 
        HandleLeftClick(e); 
       } 
       if (e.Button == GeckoMouseButton.Middle) 
       { 
        HandleMiddleClick(e); 
       } 
       if (e.Button == GeckoMouseButton.Right) 
       { 
        HandleRightClick(e); 
       } 
      } 
     } 
0

儘量把AddMessageEventListener後LoadHtml這樣的:

browser.LoadHtml(@"<!DOCTYPE html>.....</html>"); 

AddMessageEventListener("myFunction", ((string s) => this.showMessage(s))); 

,並改變它的LoadHtml這裏面的臺詞:

event = document.createEvent('MessageEvent'); 
event.initMessageEvent(name, false, false, data, null, null, null, null); 

通過這樣的:

var event = new MessageEvent(name,{'view': window, 'bubbles': false, 'cancelable': false, 'data': data}); 

你的新代碼的樣子:

public Form1() 
{ 
    InitializeComponent(); 

    browser.LoadHtml 
    (
     @"<!DOCTYPE html> 
      <html><head> 
      <meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8""> 
      <script type=""text/javascript""> 
       function fireEvent(name, data) 
       { 
        var event = new MessageEvent(name,{'view': window, 'bubbles': false, 'cancelable': false, 'data': data}); 
        document.dispatchEvent(event); 
       } 
      </script> 
      </head> 
      <body>fdsfsda 
       <input type=""button"" onclick=""fireEvent('myFunction', 'some data');"" value=""SHOW DATA"" /> 
      </body></html>" 
    ); 

    AddMessageEventListener("myFunction", ((string s) => this.showMessage(s))); 
} 

private void showMessage(string s) 
{ 
    MessageBox.Show(s); 
}