Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 试图从C在ActiveX WebBrowser中设置/获取JavaScript变量_C#_Javascript_Activex_Browser - Fatal编程技术网

C# 试图从C在ActiveX WebBrowser中设置/获取JavaScript变量

C# 试图从C在ActiveX WebBrowser中设置/获取JavaScript变量,c#,javascript,activex,browser,C#,Javascript,Activex,Browser,我们有一个包含ActiveX WebBrowser控件的windows应用程序。作为此应用程序常规操作的一部分,将对ActiveX WebBrowser控件显示的页面进行修改。部分修改涉及在加载到ActiveX WebBrowser的网页中设置JavaScript变量 我们需要在C中初始化这个变量。最初,VB6代码正在初始化这个值。此变量的值是COM可见类对象 然而,为了简单起见,我们将问题简化为设置字符串值。我们的原始页面涉及框架等,但在这样的页面中也会出现同样的问题: <HTML>

我们有一个包含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>
webBrowser1.Document.InvokeScript("eval", new String[] {"1 + 2"});
然而,在C中,我们不得不使用其他技巧,如:

Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Script, null, "field",new object[] { "newValue"},null, null);
页面的重点是测试我们的变量是否被C正确赋值。点击按钮应该会产生C注入的任何新值。例如,点击页面中的按钮,我们会得到一个提示:newValue

第一次就可以了,但是如果我们重新加载页面就不行了。在后续调用中,我们无法设置变量字段的值


以前有人做过这种类型的操作吗?

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

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

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


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

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


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

如果您使用webBrowser控件,您可以为 ObjectForScript属性

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


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

如果使用webBrowser控件,可以将c对象分配给 ObjectForScript属性

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


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

我认为您需要的是javascript中的eval方法。您可以这样从C调用它:

<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>
webBrowser1.Document.InvokeScript("eval", new String[] {"1 + 2"});
此代码将计算1+2并返回3。我可以想象如果你加入

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

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

我认为您需要的是Javascript中的eval方法。您可以这样从C调用它:

<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>
webBrowser1.Document.InvokeScript("eval", new String[] {"1 + 2"});
此代码将计算1+2并返回3。我可以想象如果你加入

InvokeScript("eval", new String[] {"varName = 3"})
如果该变量在文件中全局可见,则会将其分配给3