我通过InvokeScript使用浏览器控件的WPF变体从C#调用javascript函数。
我可以毫无问题地调用我的函数。但是当我第二次调用它时,它会抛出以下错误:
未知名称。 (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);
}
我可以通过javascript从页面调用C#函数,并从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 :(得分: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之外的其他操作?如果显示警告框,是否会出现相同的错误?
答案 1 :(得分: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")