从Web浏览器控件中读取Javascript变量
我试图读取从我的表单上的WebBrowser控件加载和调用的Javascript变量的值。
例:
index.html引用一个名为’test.js’的javascript。在test.js上,创建并填充了几个变量。
index.html然后调用这个JS。
Index.html被加载并显示在WebBrowser控件中。
我已经找到了很多关于如何调用/调用驻留在Web浏览器控件中的函数的帮助。 如何轻松读取变量值?
你可以这样做:
Document.InvokeScript("eval", new object[] { "my_var_name" });
您可以使用IHTMLDocument :: Script来检索脚本引擎的自动化接口。 如果在C#中使用Windows窗体Web浏览器控件,则意味着将HtmlDocument.DomDocument属性强制转换为mshtml.IHTMLDocument。 对于WPF,您可以直接转换文档。
全局变量作为属性和全局函数作为方法添加到脚本引擎中。 在IE9之前,如果您知道其名称,则可以使用IDispatch接口访问这些函数/变量。 HtmlDocument.InvokeScript和WPF的WebBrowser.InvokeScript以一种很好的方式包装它,但仅适用于System.Reflection.BindingFlags.InvokeMethod。 要访问变量,您需要在调用Invoke时传递DISPATCH_PROPERTYGET,即在托管代码中使用BindingFlags.GetProperty。
手动后期绑定并不好玩。如果您想知道后期绑定是多么费力,请使用Visual C#.NET检查Office自动化服务器的绑定 。
IE9中存在一个问题,即变量/函数无法通过IDispatch访问 ,但您仍然可以通过IDispatchEx以类似的方式访问变量/函数。
我不认为你能够从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变量。 我已经完成了其他项目。 希望这可以帮助。
为了访问全局范围的JavaScript变量,我使用了一个名为GetGlobalVariable()
的自定义方法。 (它使用了Juan的回答中的 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()
方法。 请注意,它会检查变量引用的每个部分以避免exception。
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; }
看一下HtmlWindow类 。 您可以从WebBrowser.Document.Window
获取它的实例。 如果你的js变量具有全局范围,它们将属于Window对象,并且应该可以从C#中的WebBrowser.Document.Window.DomWindow
访问。
我认为这确实是一个范围问题。 如果你包含一个名为test.js的文件,那么在这个文件中你有这一行:
var myVariable;
然后,该变量使用全局范围创建,并且可以从页面中的任何位置以及您包含的任何其他JavaScript文件中访问。 如果在函数之外声明一个这样的变量,它将使用全局范围创建。
一想法。 如果您无法在主页面中访问变量,请确保在页面上的JavaScript尝试使用之前包含声明它并指定值的脚本。 您可能会遇到执行问题。