8

有一个使用 WebBrowser 控件 (.NET 4) 加载与应用程序通信的网页的 Windows 窗体应用程序。有一次,我接到一个电话,InvokeScript()要求在网页中调用一个 Javascript 例程。

现在事情已经“更新”了,现在正在使用 jQuery。因此,与其OnVenueSelected()调用函数,不如说是有些$.city.venue.onVenueSelected: function(param)奇怪。

简单地将我的电话从 更改InvokeScript("OnVenueSelected", new object[] { params })InvokeScript("$.city.venue.onVenueSelected", new object[] { params })不起作用。我没有得到任何可观察到的错误或异常,但调用中的逻辑没有被调用。

一些挖掘让我尝试将其eval用作调用并将函数名称和参数作为字符串传递给eval. 那也没有用。

有没有一种已知的方法来调用嵌入在几层 jQuery 魔法中的函数?

谢谢。

4

3 回答 3

8

好的 - 我要回答我自己的问题。部分感谢 如何使用 InvokeScript() 从 .NET WebBrowser 控件调用 jQuery 函数?,我能够将对 jQuery 函数的调用更改为

string[] codeString = { String.Format(" {0}('{1}') ", @"$.city.venue.onVenueSelected", result.ToString()) };
this.myBrowser.Document.InvokeScript("eval", codeString);

令人惊讶的是,这似乎奏效了。

就我而言,结果变量是类型bool(以防对任何人都重要)。

于 2012-02-08T19:13:58.870 回答
2

对于那些可能不知道的人,您还可以在 .NET 之前版本的 WB 控件和当前/.NET 版本的 WB 控件中使用 .execScript。您还可以选择要执行的脚本的语言,即:“JScript”或“VBScript”。这是一个班轮:

WebBrowser1.Document.parentWindow.execScript "alert('hello world');", "JScript"
于 2012-02-11T22:19:21.390 回答
1

是的,这可能是最快的方法,因为“invokescript”只需要一个全局函数的名称。因此,在将函数深入到某些结构中之后,并且仍然能够通过 InvokeScript 以“更漂亮”的方式调用它们,例如,您必须编写一个 GLOBAL 包装器(“调度程序”将是更好的名字),类似于:

function callme(what, args) {
   var actualfunction = eval(what);   // or any other way to parse the 'what' and get a function
   return actualfunction(args);
}

后来称之为:

  • 来自 JS:

    callme("$.city.venue.onVenueSelected", ..args..)
    

    (但我真的不知道你为什么要从 JS 中调用它 :))

  • 并来自 CS:

    browser.InvokeScript("callme", new string[]{ "$.city.venue.onVenueSelected", ..args.. })
    

这样,我认为您可以直接将对象作为函数参数传递,而无需对它们进行字符串化

..但根据我的经验,在超过 80% 的情况下,您只需要传递一些简单的数字和字符串或设置标志,所以所有这些麻烦通常只是代码膨胀

于 2012-02-10T11:15:31.103 回答