C# WPF WebBrowser - 如何将数组传递给 JavaScript 函数
本文关键字:JavaScript 函数 数组 WebBrowser WPF | 更新日期: 2023-09-27 18:33:28
我正在尝试向谷歌地图添加多个标记。数据来自 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 的异常报告是这样的:System.Runtime.InteropServices.COMException Exception from HRESULT: 0x80020101异常的位置就在这里:
webBrowser1.InvokeScript("addMarker", new object[] { lat, lon });
我对Javascript编程很陌生。请帮忙。
据我所知,不可能直接传递数组。
您应该将其作为 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
。
看到这个SO答案: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代码写入控制台。