尝试在C#中的ActiveX WebBrowser中设置/获取JavaScript变量
-
02-07-2019 - |
题
我们有一个包含ActiveX WebBrowser控件的Windows应用程序。作为此应用程序的常规操作的一部分,将对ActiveX WebBrowser控件显示的页面进行修改。部分修改涉及在加载到ActiveX WebBrowser中的网页中设置JavaScript变量。
我们需要在C#中初始化这个变量(最初,VB6代码正在初始化该值)。此变量的值是COM可见的类对象。
但是,为简单起见,我们将问题简化为设置字符串值。我们的原始页面涉及框架等,但在这样的页面中会出现同样的问题:
<HTML>
<HEAD>
<TITLE>Test</TITLE>
<SCRIPT type="text/javascript">
var field = 'hello world';
</SCRIPT>
</HEAD>
<BODY>
<input type="button" value="See field" onclick="javascript:alert(field);"/>
</BODY>
</HTML>
我们想要访问字段变量并为其赋值。在VB6中,代码非常简单:
doc.Script.field = 'newValue'
然而,在C#中我们不得不求助于其他技巧,如下:
Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Script, null, "field",new object[] { "newValue"},null, null);
页面的要点是测试我们的变量是否由C#正确分配。单击该按钮应该产生C#注入的任何新值。例如,点击页面中的按钮,我们会收到一条警告:“newValue”。
这是第一次使用,但如果我们重新加载页面则不起作用。在后续调用中,我们无法设置变量 field
的值。
以前有没有人有过做这种操作的经验?
解决方案 3
这两篇文章帮助我们找到了解决问题的方法。他们概述了人们需要知道的基本知识:
使用C# Microsoft Web Browser Automation
所以我们实现了一个DocHostUIHandler接口,允许我们设置UIHandler,允许我们从Javascript引用该方法。
其他提示
我认为你要找的是Javascript中的 eval()
方法。您可以像这样从C#调用它:
webBrowser1.Document.InvokeScript("eval", new String[] {"1 + 2"});
此代码将评估&quot; 1 + 2&quot;
并返回&quot; 3&quot;
。我想如果你要放入
InvokeScript("eval", new String[] {"varName = 3"})
如果文件中全局可见,则将该变量分配给3。
如果使用webBrowser控件,则可以为其指定c#对象 objectForScripting属性 http://msdn.microsoft.com/ EN-US /库/ system.windows.forms.webbrowser.objectforscripting.aspx
之后你可以使用javascript中的window.external与javascript中的c#对象进行交互
如果您出于某种原因使用activeX版本,则可以通过javascript:urls以编程方式设置变量,或者您可以使用webservice / database / file同步您的脚本,或者只使用您建议的方法。
我们使用的常用方法是在页面上添加隐藏文本输入框(ASP.Net控件版本)。这样,您可以轻松地在C#代码隐藏中设置其值,并在客户端JavaScript中读取值(当然,反之亦然)。