如何使用InvokeScript()从.NET WebBrowser控件调用jQuery函数?

时间:2012-02-08 05:00:37

标签: jquery webbrowser-control invokescript

使用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魔法中的函数?

感谢。

3 个答案:

答案 0 :(得分:8)

好的 - 我可以回答我自己的问题。部分感谢How to call a jQuery function from .NET WebBrowser control using InvokeScript()?的答案,我能够将我对jQuery函数的调用更改为

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

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

就我而言,结果变量的类型为bool(如果对任何人都很重要)。

答案 1 :(得分:2)

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

WebBrowser1.Document.parentWindow.execScript "alert('hello world');", "JScript"

答案 2 :(得分: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%的情况下,你只需要传递一些简单的数字和字符串或设置标志,所以所有麻烦通常只是代码膨胀