2013-07-18 3 views
1

Я вызываю функции javascript из C#, используя WPF-вариант управления браузером через InvokeScript.WPF Browser throws error

Я могу назвать свою функцию один раз без проблем. Но когда я его вызываю второй раз, это вызывает следующую ошибку:

Неизвестное имя. (Исключение из 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#, просто не можете вызывать второй раз. Независимо от того, какую функцию я называю.

Я не понимаю, почему это не получится во второй раз.

Спасибо

Edit:

ли следующий тест (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); 
      } 

И по-прежнему бросает тот же ошибка (после первого вызова), это говорит о том, что не имеет значения, откуда она называется, i nvoking функция из C# будет вызывать эту ошибку, если она выполняется более одного раза.

+0

Попробуйте вызвать ту же функцию дважды с самой веб-страницы, чтобы гарантировать, что нет ничего плохого со страницей – TGH

+0

Обновленный пост с секцией редактирования с тестом что гарантирует, что на странице нет ничего плохого. Сама страница чрезвычайно проста, только голова, тело и javascript. –

ответ

0

Я предполагаю, что вы сделали то же, что и я, и поместили свои скрипты в тело. По какой-то причине, когда вы вызываете document.write из wpf, он полностью перезаписывает документ. Если вместо использования 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

Проблема в том, что я могу назвать это (метод C#) со стороны JS таким образом. Я хочу, чтобы C# вызывал JS тоже произвольно. –