2013-07-18 82 views
1

我從C#使用瀏覽器控件的WPF變體通過InvokeScript調用JavaScript函數。WPF瀏覽器拋出錯誤

我可以調用我的函數一次沒有任何問題。但是當我第二次調用它時,它會拋出以下錯誤:

未知名稱。 (從HRESULT異常:0x80020006 (DISP_E_UNKNOWNNAME))

我使用的代碼如下:

this.browser.LoadCompleted += (sender, args) => 
{ 
    this.browser.InvokeScript("WriteFromExternal", new object[] { "firstCall" }); // works 
    this.browser.InvokeScript("WriteFromExternal", new object[] { "secondCall" }); // throws error 
}; 

JavaScript函數是:

function WriteFromExternal(message) { 
    document.write("Message : " + message); 
} 

我可以調用C#函數從頁面通過javascript只是罰款和從C#調用,只是不能再次調用。無論我打電話給什麼功能。

我不明白爲什麼它會第二次失敗。

謝謝

編輯:

做了以下測試(JavaScript的):

 function pageLoaded() { 
      window.external.tick(); 
      window.external.tick(); 
      window.external.tick(); 
     } 
     window.onload = pageLoaded; 
     function WriteFromExternal(message) { 
      document.write("Message : " + message); 
     } 

這是C#的一面:

  private int i = 0; 
      public void tick() 
      { 
       invoke("WriteFromExternal", new object[] { "ticked"+ i++ }); 
      } 
      public static void invoke(string method, object[] parameters) 
      { 
       mainInterface.browser.InvokeScript(method, parameters); 
      } 

而且還拋出相同錯誤(在第一次通話之後),這表明從它被稱爲的地方來看並不重要從C#中調用函數將拋出此錯誤,如果不止一次。

+0

嘗試從網頁本身調用同一個功能兩次,以確保沒有什麼不對的頁面 – TGH

+0

更新後與測試一個編輯部分確保頁面沒有任何問題。該頁面本身非常簡單,只有頭部,身體和JavaScript。 –

回答

0

我假設你和我一樣,並把你的腳本放在身體裏。由於某些原因,當您從wpf調用document.write時,它會完全覆蓋文檔。如果不是使用document.write,而是追加一個孩子,它可以正常工作。因此,改變你的JavaScript函數爲:

window.WriteFromExternal = function (message) { 
 
    var d = document.createElement("div") 
 
    d.innerHTML= "Message : " + message; 
 
    document.body.appendChild(d); 
 
} 
 
    
 
// call from c# 
 
WriteFromExternal("test")

0

這是一段時間,因爲我做了類似的事情,但從我記得你的代碼看起來正確。不過,我記得在我的項目中使用了一個稍微不同的模式。相反,委託回JS方法在頁面上我會做我的ScriptingHost方法的返回值

EX: C#:

public string tick() 
{ 
    return "some stuff"; 
} 

var msg = window.external.tick(); 
document.write(msg); 

如果你有比簡單的字符串更復雜的對象,你可以將它們序列化到JSON並將它們解析成JS端的一個對象。

var jsonObj = JSON.parse(window.external.someMethod()); 

不知道你是否有能夠改變你的方法簽名在你的腳本對象的奢侈品,但它至少一種替代方法。

此外,在您當前的實現中,您是否嘗試過執行document.write之外的其他操作?如果顯示警告框,你會得到同樣的錯誤嗎?

+0

問題是我只能從JS方面調用它(C#方法)。我希望C#也可以任意調用JS。 –

相關問題