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

Posted

技术标签:

【中文标题】从 Web 浏览器控件中读取 Javascript 变量【英文标题】:Read Javascript variable from Web Browser control 【发布时间】:2011-10-16 03:13:58 【问题描述】:

我正在尝试读取从表单上的 WebBrowser 控件加载和调用的 javascript 变量的值。

例子:

index.html 指的是一个名为“test.js”的javascript 在 test.js 上,创建并填充了几个变量。

index.html 然后调用这个 JS。

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

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

【问题讨论】:

【参考方案1】:

为了访问全局范围的 JavaScript 变量,我使用了此处包含的自定义方法,称为 GetGlobalVariable()(它使用来自Juan's answer 的Document.InvokeScript。+1)

假设您的 JavaScript 变量在全局范围内创建,如下所示:

var foo = "bar";
var person = ;
var person.name = "Bob";

然后您可以像这样使用 C# GetGlobalVariable() 方法访问这些值。 (您可能需要设置timer 以不断检查变量是否已填充。)

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;

【讨论】:

【参考方案2】:

你可以这样做:

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

【讨论】:

【参考方案3】:

您可以使用 IHTMLDocument::Script 来检索脚本引擎的自动化接口。如果您在 C# 中使用 Windows 窗体 webbrowser 控件,这意味着将 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# .NET。

There is a problem in IE9 that the variables/functions are not accessible via IDispatch,但您仍然可以通过 IDispatchEx 以类似的方式访问变量/函数。

【讨论】:

同意,InvokeScript 是获取/设置全局 JS 变量(最后是 HTMLWindow 自定义属性)的最正确方法。在另一个线程中查看我的评论:***.com/questions/11242482/…【参考方案4】:

看看HtmlWindow Class。您可以从WebBrowser.Document.Window 获取它的实例。如果您的 js 变量具有全局范围,它们将属于 Window 对象,并且应该可以从 C# 中的WebBrowser.Document.Window.DomWindow 访问。

【讨论】:

【参考方案5】:

我不认为您将能够从您的 JS 中获取变量的值,因为您的 C# 将在您的 js var 甚至存在之前运行。我自己在获取 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();

不是 100% 会起作用,但我知道您可以通过这种方式访问​​您的 js 变量。我已经在其他项目中做到了这一点。希望这会有所帮助。

【讨论】:

【参考方案6】:

我认为这确实是一个范围界定问题。如果您包含一个名为 test.js 的文件,并且在该文件中您有以下行:

var myVariable;

然后,该变量是在全局范围内创建的,并且可以从您页面中的任何位置以及您包含的任何其他 JavaScript 文件中访问。如果您在函数之外声明这样的变量,它将在全局范围内创建。

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

【讨论】:

那么在我的 WebBrowser 控件加载网页后,如何从我的 c# 应用程序内部访问 myVariable? 如果这是您要问的问题,您可能需要返回并编辑您的原始问题。不是很清楚。

以上是关于从 Web 浏览器控件中读取 Javascript 变量的主要内容,如果未能解决你的问题,请参考以下文章

MS Access VBA从Web浏览器控件的内容中获取数据

如何从托管 WebBrowser 控件的应用程序调用 WebBrowser 控件查看的页面中的 JavaScript 函数?

如何将 HTML/JavaScript 从嵌入式资源加载到 winform Web 浏览器

Web 浏览器无法读取 javascript 等。

在 C# Web 浏览器中创建 javascript 变量全局范围

从 ASP 标签控件中读取文本(由 jquery 填充)