【问题标题】:Trying to set/get a JavaScript variable in an ActiveX WebBrowser from C#尝试从 C# 在 ActiveX WebBrowser 中设置/获取 JavaScript 变量
【发布时间】:2010-09-13 06:23:22
【问题描述】:

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

我们想要访问 field 变量并为其赋值。在 VB6 中,这方面的代码非常简单:

doc.Script.field = 'newValue'

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

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

页面的重点是测试我们的变量是否被 C# 正确分配。单击该按钮应该会产生 C# 注入的任何新值。因此,例如,单击页面中的按钮,我们会收到一条警报,显示:“newValue”。

这第一次有效,但如果我们重新加载页面,它就不起作用了。在随后的调用中,我们无法设置变量 field 的值。

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

【问题讨论】:

    标签: c# javascript activex browser


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      Microsoft Web Browser Automation using C#

      Using MSHTML Advanced Hosting Interfaces

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

      【讨论】:

        【解决方案3】:

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

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

        如果您出于某种原因使用 activeX 版本,您可以通过 javascript: urls 以编程方式设置您的变量,或者您可以使用 web 服务/数据库/文件或仅使用您建议的方法同步您的脚本。

        【讨论】:

          【解决方案4】:

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

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

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

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

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

          【讨论】:

            猜你喜欢
            • 2012-06-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-16
            • 1970-01-01
            • 2010-10-13
            • 2012-08-26
            • 2013-02-07
            相关资源
            最近更新 更多