尝试在C#中的ActiveX WebBrowser中设置/获取JavaScript变量

Est*_*nes 1 javascript c# browser activex

我们有一个包含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>
Run Code Online (Sandbox Code Playgroud)

我们想要访问字段变量并为其赋值.在VB6中,代码非常简单:

doc.Script.field = 'newValue'
Run Code Online (Sandbox Code Playgroud)

但是,在C#中我们不得不求助于其他技巧,如下所示:

Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Script, null, "field",new object[] { "newValue"},null, null);
Run Code Online (Sandbox Code Playgroud)

页面的要点是测试我们的变量是否由C#正确分配.单击该按钮应该产生C#注入的任何新值.因此,例如,单击页面中的按钮,我们会收到一条警告:"newValue".

这是第一次工作,但如果我们重新加载页面它不起作用.在后续调用中,我们无法设置变量的值field.

以前有没有人有过做这种操作的经验?

小智 7

我认为你要找的是eval()Javascript中的方法.您可以像这样从C#调用它:

webBrowser1.Document.InvokeScript("eval", new String[] {"1 + 2"});
Run Code Online (Sandbox Code Playgroud)

此代码将评估"1 + 2"并返回"3".我想如果你要投入

InvokeScript("eval", new String[] {"varName = 3"})
Run Code Online (Sandbox Code Playgroud)

如果在文件中全局可见,则将该变量分配给3.