【问题标题】:How to call a jQuery function from .NET WebBrowser control using InvokeScript()?如何使用 InvokeScript() 从 .NET WebBrowser 控件调用 jQuery 函数?
【发布时间】:2012-02-08 05:00:37
【问题描述】:

有一个 Windows 窗体应用程序使用 WebBrowser 控件 (.NET 4) 加载与应用程序通信的网页。我曾经打电话给InvokeScript() 来调用网页中的一个Javascript 例程。

现在事情已经“更新”了,现在正在使用 jQuery。因此,不再需要调用 OnVenueSelected() 函数,而是使用 $.city.venue.onVenueSelected: function(param) 奇怪的函数。

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

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

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

谢谢。

【问题讨论】:

    标签: jquery webbrowser-control invokescript


    【解决方案1】:

    好的 - 我可以回答我自己的问题。部分感谢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(如果这对任何人都很重要)。

    【讨论】:

    • @GuysWithDogs 我给了你一种替代方法,以防万一这个方法在某个阶段让你失望,也许把我的一个衬里贴在你代码的 cmets 上面的 .InvokeScript 上——尽管如果你必须选择,我会使用 InvokeScript 作为第一个计划,但我提供的那个也适用于 WB 控件的 pre-.NET 版本。希望你的队友一切顺利,干杯,Erx。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      是的,这可能是最快的方法,因为“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% 的情况下,您只需要传递一些简单的数字和字符串或设置标志,所以所有这些麻烦通常只是代码膨胀

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-31
        • 1970-01-01
        • 2010-11-05
        • 2010-11-29
        • 1970-01-01
        • 2015-05-07
        相关资源
        最近更新 更多