1

我通过 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# 中的函数将抛出此错误。

4

2 回答 2

0

自从我做了类似的事情以来已经有一段时间了,但是据我所知,您的代码看起来是正确的。但是,我确实记得在我的项目中使用了稍微不同的模式。我不会委托给页面上的 JS 方法,而是让我的 ScriptingHost 方法返回值

例如: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 之外的其他操作?如果显示警告框,是否会出现相同的错误?

于 2013-07-18T05:04:00.210 回答
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")

于 2017-02-03T02:48:11.693 回答