【问题标题】:C# WPF WebBrowser - how to pass an array to a javascript functionC# WPF WebBrowser - 如何将数组传递给 javascript 函数
【发布时间】:2016-02-07 02:06:52
【问题描述】:

我正在尝试向谷歌地图添加多个标记。数据来自 C# WPF。

这是 C# 代码:

private void Button_click(object sender, RoutedEventArgs e)
{
    int[] lat = { 10, 30, 50, 70 };
    int[] lon = { 10, 30, 50, 70 };

    webBrowser1.InvokeScript("addMarker", new object[] { lat, lon });
}

这是嵌入在本地 html 文件中的 javascript 函数:

function addMarker(Lat,Long) {
    for (var i=0;i<Lat.length; i++){
        var latLng = new google.maps.LatLng(Lat[i],Long[i]);
        var marker = new google.maps.Marker({
            position: latLng,
            title: 'Hello World!',
            map: map
        });
    }
    } // end of addMarker

当我用 VS 2015 编译这个程序并单击按钮来调用这个 js 脚本时,我总是收到一条错误消息,告诉我在 'var' 之后的这一行中应该有一个函数

for (var i=0;i<Lat.length; i++){

VS的异常报告是这样的: 来自 HRESULT 的 System.Runtime.InteropServices.COMException 异常:0x80020101 异常的位置就在这里:

webBrowser1.InvokeScript("addMarker", new object[] { lat, lon });

我对 Javascript 编程非常陌生。请帮忙。

【问题讨论】:

  • 去掉for中的“var”,不需要。
  • 按照您的建议,错误仍然存​​在。但是这次错误的位置被移到了'('的左侧。for (i=0; i
  • 检查发送到函数的对象。我认为它的格式不是您的循环想要执行的方式。将LatLog 记录到控制台。
  • JS 中 Lat 的类型显示为“未知”,这行:alert(typeof(Lat));如何解决?

标签: javascript c# wpf google-maps


【解决方案1】:

据我所知,直接传递数组是不可能的。

您应该将其作为 JSON 字符串传递。 (我通过 NuGet 使用NewtonSoft!)

guiWebbrowser.InvokeScript("addMarker", JsonConvert.SerializeObject(new
         {
            Lat = new int[] { 10, 20, 30 },
            Long = new int[] { 10, 20, 30 }
         }));

您的 JS 函数应如下所示:

function addMarker(jsonArg) {
   var args = JSON.parse(jsonArg);
   for (var i = 0; i < args.Lat.length; i++) {
      var latLng = new google.maps.LatLng(args.Lat[i], args.Long[i]);
      var marker = new google.maps.Marker({
         position: latLng,
         title: 'Hello World!',
         map: map
      });
   }
} // end of addMarker

您可能会收到此错误消息:JSON is undefined

看到这个答案:https://stackoverflow.com/a/22287896/3631348

您应该在应用中的任何位置调用此函数:

public void ModifyBrowserEmulation(int version = 11001)
{
   // see https://stackoverflow.com/a/22287896/3631348 --> edit your application name ! or get it via Reflection !

   var appExe = System.IO.Path.GetFileName(Assembly.GetExecutingAssembly().Location);
   Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", appExe, version, RegistryValueKind.DWord);
   Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", appExe.Replace(".exe", ".vshost.exe"), version, RegistryValueKind.DWord);

   Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", appExe, version, RegistryValueKind.DWord);
   Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", appExe.Replace(".exe", ".vshost.exe"), version, RegistryValueKind.DWord);
}

另一个有用的帖子:https://stackoverflow.com/a/31728506/3631348 如何从您的 JS 代码写入控制台。

【讨论】:

  • 虽然这是一个延迟很多的答案,但它是正确的。谢谢。
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 2013-05-25
  • 2013-02-03
  • 1970-01-01
  • 2018-11-14
  • 2021-04-21
相关资源
最近更新 更多