使用 WebBrowser.Document.InvokeScript 调用 javascript 对象方法

Posted

技术标签:

【中文标题】使用 WebBrowser.Document.InvokeScript 调用 javascript 对象方法【英文标题】:Calling javascript object method using WebBrowser.Document.InvokeScript 【发布时间】:2011-11-11 10:52:30 【问题描述】:

在我的 WinForms 应用程序中,我需要从我的 WebBrowser 控件调用 javascript 函数。我使用了 Document.InvokeScript,它可以完美地与单独的函数配合使用,例如

Document.InvokeScript("function").

但是当我想调用 javascript 对象方法时,例如

Document.InvokeScript("obj.method")

它不起作用。有没有办法让它工作?或者这个问题的不同解决方案? 无需更改 javascript 代码中的任何内容!

提前致谢:)

【问题讨论】:

可以说我的 javascrip 中有类似的东西:obj = method : function() alert("...) 我想从我的 webbrowser 控件中调用 obj.method() 【参考方案1】:

documentation 中的示例不包含括号。

private void InvokeScript()

    if (webBrowser1.Document != null)
    
        htmlDocument doc = webBrowser1.Document;
        String str = doc.InvokeScript("test").ToString() ;
        Object jscriptObj = doc.InvokeScript("testJScriptObject");
        Object domOb = doc.InvokeScript("testElement");
    

试试

Document.InvokeMethod("obj.method");

请注意,如果您使用HtmlDocument.InvokeScript Method (String, Object[]),则可以传递参数。

编辑

看来您不是唯一遇到此问题的人:HtmlDocument.InvokeScript - Calling a method of an object。您可以像该链接的海报所建议的那样制作“代理功能”。基本上,您有一个调用对象函数的函数。这不是一个理想的解决方案,但它肯定会奏效。我会继续看看这是否可行。

关于同一问题的另一篇文章:Using WebBrowser.Document.InvokeScript() to mess around with foreign JavaScript。 C. Groß 在 CodeProject 上提出的有趣解决方案:

private string sendJS(string JScript) 
    object[] args = JScript;
    return webBrowser1.Document.InvokeScript("eval",args).ToString();

您可以在 HtmlDocument 上创建一个扩展方法并调用它来运行您的函数,仅使用这个新函数,您将在传入的字符串中包含括号、参数、整个九码(因为它只是传递给一个评估)。

看起来 HtmlDocument 不支持对现有对象调用方法。只有全局函数。 :(

【讨论】:

哦,抱歉,这是我写这篇文章时的错误。在我的代码中,我从未使用过括号(我已经编辑了帖子)。有什么想法现在可能出了什么问题? 第二种解决方案效果很好!谢谢,因为在您链接的帖子中,我主要关心的是不要更改 javascript 代码。所以再次感谢它是我正在寻找的:) 第二个解决方案非常棒,节省了我几个小时。【参考方案2】:

很遗憾,您不能使用 WebBrowser.Document.InvokeScript 直接调用对象方法。

解决方案是在 JavaScript 端提供一个全局函数,可以重定向您的调用。最简单的形式如下:

function invoke(method, args) 

    // The root context is assumed to be the window object. The last part of the method parameter is the actual function name.
    var context = window;
    var namespace = method.split('.');
    var func = namespace.pop();

    // Resolve the context
    for (var i = 0; i < namespace.length; i++) 
        context = context[namespace[i]];
    

    // Invoke the target function.
    result = context[func].apply(context, args);

在您的 .NET 代码中,您可以按如下方式使用它:

var parameters = new object[]  "obj.method", yourArgument ;
var resultJson = WebBrowser.Document.InvokeScript("invoke", parameters);

正如您提到的,您无法对现有 JavaScript 代码进行任何更改,因此您必须以某种方式注入上述 JavaScript 方法。幸运的是,WebBrowser 控件也可以通过调用 eval() 方法为您完成:

WebBrowser.Document.InvokeScript("eval", javaScriptString);

有关更健壮和完整的实现,请参阅我编写的 WebBrowser 工具和解释 ScriptingBridge 的文章,该文章专门用于解决您描述的问题。

【讨论】:

【参考方案3】:
 webBrowser.Document.InvokeScript("execScript", new object[]  "this.alert(123)", "JavaScript" )

你应该是这样的

 webBrowser.Document.InvokeScript("execScript", new object[]  "obj.method()", "JavaScript" )

【讨论】:

以上是关于使用 WebBrowser.Document.InvokeScript 调用 javascript 对象方法的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)