从Web浏览器控件中读取Javascript变量

11

我正在尝试读取一个Javascript变量的值,该变量是从我的表单中加载和调用WebBrowser控件中的。

例如:

index.html引用名为“test.js”的javascript文件。 在test.js中,创建并填充了几个变量。

然后,index.html调用此JS。

Index.html被加载并显示到WebBrowser控件中。

我已经找到了很多关于如何调用/调用驻留在web浏览器控件中的函数的帮助。但如何轻松读取变量值呢?

6个回答

10

你可以这样做:

Document.InvokeScript("eval", new object[] { "my_var_name" });

2
您可以使用 IHTMLDocument::Script 来检索脚本引擎的自动化接口。如果您在 C# 中使用 Windows Forms 网页浏览器控件,则意味着将 HtmlDocument.DomDocument 属性转换为 mshtml.IHTMLDocument。对于 WPF,您直接转换文档即可。
全局变量添加到脚本引擎作为属性,全局函数添加为方法。在 IE9 之前,如果您知道它们的名称,可以使用 IDispatch 接口访问这些函数/变量。HtmlDocument.InvokeScript 和 WPF 的 WebBrowser.InvokeScript 将其封装得很好,但仅适用于 System.Reflection.BindingFlags.InvokeMethod。要访问变量,您需要在调用 Invoke 时传递 DISPATCH_PROPERTYGET,也就是在托管代码中使用 BindingFlags.GetProperty。
手动后期绑定不好玩,如果您想知道后期绑定有多费力,请查看 Binding for Office automation servers with Visual C# .NETIE9 存在一个问题,即无法通过 IDispatch 访问变量/函数,但您仍然可以以类似的方式通过 IDispatchEx 访问变量/函数。

同意,InvokeScript 是获取/设置全局 JS 变量(最终是 HTMLWindow 自定义属性)的最正确的方法。请参阅我的另一篇评论: http://stackoverflow.com/questions/11242482/c-sharp-get-variable-from-webbrowser-generated-by-javascript#comment18867034_11317873 - RReverser

1

我认为你无法仅从JS中获取变量的值,因为你的C#将在js变量存在之前运行。我自己也遇到了同样的问题,无法直接获取js变量的值。你可以使用HtmlTextWriter方法来获取这些值。这将允许你使用C#渲染的js调用,以便访问变量的值。

例如:

 protected override void RenderContents(HtmlTextWriter writer)
    {
        EnsureChildControls();
        base.RenderContents(writer);

writer.BeginRender();
        writer.RenderBeginTag(HtmlTextWriterTag.Script);
        writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/javascript");

        writer.Write("myJavaScriptVar = (\" + myC#Var + \")"); 
writer.RenderEndTag();

不能保证百分之百可行,但我知道你可以用这种方式访问你的js变量。我在其他项目中也这样做过。希望能对你有所帮助。


1
为了访问全局范围的JavaScript变量,我使用了一个自定义方法,包括在此处称为GetGlobalVariable()的方法。(它使用Juan's answer中的Document.InvokeScript方法。+1) 假设您在全局范围内创建了JavaScript变量,如下所示:
var foo = "bar";
var person = {};
var person.name = "Bob";

然后,您可以使用C#的GetGlobalVariable()方法来访问这些值。像这样。(您可能需要设置一个计时器来不断检查变量是否已填充。)
var foo = GetGlobalVariable(webBrowser, "foo");
var name = GetGlobalVariable(webBrowser, "person.name");

这里是 GetGlobalVariable() 方法。请注意,它检查变量引用的每个部分以避免异常。

private object GetGlobalVariable(WebBrowser browser, string variable)
{
    string[] variablePath = variable.Split('.');
    int i = 0;
    object result = null;
    string variableName = "window";
    while  (i < variablePath.Length)
    {
        variableName = variableName + "." + variablePath[i];
        result = browser.Document.InvokeScript("eval", new object[] { variableName });
        if (result == null)
        {
            return result;
        }
        i++;
    }
    return result;
}

0

看一下HtmlWindow类。你可以从WebBrowser.Document.Window获取它的实例。如果你的js变量具有全局作用域,它们将属于Window对象,并且应该可以从C#中的WebBrowser.Document.Window.DomWindow访问。


-4

我认为这实际上是一个作用域问题。如果你包含了一个名为test.js的文件,并且在该文件中有以下代码:

var myVariable;

然后,该变量将以全局范围创建,并可从页面的任何位置以及包含在其中的任何其他JavaScript文件中进行访问。如果您像那样在函数外部声明变量,它将被创建为具有全局范围的变量。

一个想法。如果您无法在主页中访问变量,请确保在页面上尝试使用它之前,已经包含了声明和赋值的脚本。您可能会遇到执行顺序问题。


那么,在WebBrowser控件加载网页后,我如何从我的C#应用程序中访问myVariable? - AllStar11
如果这是你要问的问题,你可能需要返回并编辑你的原始问题。它不是非常清楚。 - Rudy Lacovara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接