1

我们有一个包含 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

以前有没有人做过这种手术的经验?

4

4 回答 4

7

我认为您正在寻找的是eval()Javascript 中的方法。您可以像这样从 C# 调用它:

webBrowser1.Document.InvokeScript("eval", new String[] {"1 + 2"});

此代码将评估"1 + 2"并返回"3". 我会想象如果你把

InvokeScript("eval", new String[] {"varName = 3"})

如果该变量在文件中全局可见,您将获得分配给 3 的变量。

于 2009-11-19T14:44:28.833 回答
2

如果使用 webBrowser 控件,可以将 ac# 对象分配给 objectForScripting 属性 http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.objectforscripting.aspx

之后,您可以在您的 javascript 中使用 window.external 从 javascript 与您的 c# 对象进行交互

如果您出于某种原因使用 activeX 版本,您可以通过 javascript: urls 以编程方式设置您的变量,或者您可以使用 webservice/database/file 或简单地使用您建议的方法来同步您的脚本。

于 2008-10-14T06:22:26.040 回答
1

这两篇文章帮助我们找到了解决问题的方法。他们概述了人们需要了解的基础知识:

使用 C# 的 Microsoft Web 浏览器自动化

使用 MSHTML 高级托管接口

所以我们实现了一个 DocHostUIHandler 接口,它允许我们设置一个 UIHandler,允许我们从 Javascript 中引用该方法。

于 2008-09-26T19:18:31.850 回答
0

我们常用的方法是在页面上添加一个隐藏的文本输入框(ASP.Net控件版)。这样,您可以轻松地在 C# 代码隐藏中设置其值并在客户端 JavaScript 中读取值(当然反之亦然)。

于 2008-09-25T21:18:31.423 回答