从 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 浏览器