Javascript 从Google Maps(V3)外部打开特定标记的信息窗口

Javascript 从Google Maps(V3)外部打开特定标记的信息窗口,javascript,database,google-maps,google-maps-markers,infowindow,Javascript,Database,Google Maps,Google Maps Markers,Infowindow,我似乎无法解决这个问题: 我有一张地图,上面有(许多)来自生成的XML文件的标记(公司)。在地图下面,我想显示一个(非JavaScript生成的)地图上显示的所有公司的列表。当我点击列表中的一家公司时,地图会平移到那个特定的标记并打开一个信息窗口。问题是我希望地图和列表是两个独立的东西 解决这个问题的正确方法是什么?谢谢重要的是,所有markerinfo都是动态的 function initialize_member_map(lang) { var map = new google.maps

我似乎无法解决这个问题:

我有一张地图,上面有(许多)来自生成的XML文件的标记(公司)。在地图下面,我想显示一个(非JavaScript生成的)地图上显示的所有公司的列表。当我点击列表中的一家公司时,地图会平移到那个特定的标记并打开一个信息窗口。问题是我希望地图和列表是两个独立的东西

解决这个问题的正确方法是什么?谢谢重要的是,所有markerinfo都是动态的

function initialize_member_map(lang) {
  var map = new google.maps.Map(document.getElementById("large-map-canvas"), {
    center: new google.maps.LatLng(50.85034, 4.35171),
    zoom: 13,
    mapTypeId: 'roadmap'
  });
  var infoWindow = new google.maps.InfoWindow;

  downloadUrl("/ajax/member-xml-output.php", function(data) {
  var xml = data.responseXML;
  var markers = xml.documentElement.getElementsByTagName("marker");
  var bounds = new google.maps.LatLngBounds();
  for (var i = 0; i < markers.length; i++) {
    var company = markers[i].getAttribute("company");
    var address = markers[i].getAttribute("address");
    var type = markers[i].getAttribute("type");
    var uid = markers[i].getAttribute("uid"); // Primary key of company table in MySQL
    var point = new google.maps.LatLng(
        parseFloat(markers[i].getAttribute("lat")),
        parseFloat(markers[i].getAttribute("lng")));
    var html = "<b>" + company + "</b> <br/>" + address;
    bounds.extend(point);    
    var marker = new google.maps.Marker({
      map: map,
      position: point,
      uid: uid // Some experiments, wanted to use this to target specific markers...
    });
    bindInfoWindow(marker, map, infoWindow, html); 
  }        
  map.setCenter(bounds.getCenter());
  map.fitBounds(bounds); 
});
}

function bindInfoWindow(marker, map, infoWindow, html) {
  google.maps.event.addListener(marker, 'click', function() {
    infoWindow.setContent(html);
    infoWindow.open(map, marker);
  });
}

function downloadUrl(url, callback) {
  var request = window.ActiveXObject ?
    new ActiveXObject('Microsoft.XMLHTTP') :
    new XMLHttpRequest;

  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      request.onreadystatechange = doNothing;
      callback(request, request.status);
    } 
  };

  request.open('GET', url, true);
  request.send(null);
}
function doNothing() {}

你在正确的轨道上。您只需要为标记对象创建一个单独的全局数组,并将所有创建的标记推送到该数组中。当您将所有公司数据写入html时,包括一个调用,该调用带有单击时执行的标记索引。下面是一个示例代码。我使用JSON作为数据结构来保存公司信息,而不是XML


谷歌地图滚动到标记
var映射;
//公司数据的JSON-相当于XML
公司={
“数据”:[
{
“名称”:“公司1”,
“lat”:42.166,
“液化天然气”:-87.848
}, 
{
“名称”:“公司2”,
“lat”:41.8358,
“液化天然气”:-87.7128
},
{
“名称”:“公司3”,
“lat”:41.463,
“液化天然气”:-88.870
},
{“名称”:“公司4”,
“lat”:41.809,“液化天然气”:-87.790}
]
}
//我们将使用它来存储google地图标记对象
var markers=新数组();
函数初始化(){
var chicago=new google.maps.LatLng(41.875696,-87.624207);
变量myOptions={
缩放:9,
中心:芝加哥,
mapTypeId:google.maps.mapTypeId.ROADMAP
}
map=new google.maps.map(document.getElementById(“map_canvas”),
肌肽);
上市公司();
}		 
功能列表公司(){
html=“”
//环游所有公司

对于(i=0;i由于我无法删除此答案,我决定添加一些注释

如果您的xml格式与此类似:

您可以通过以下行访问作者节点值

markers = xml.documentElement.getElementsByTagName("book");

for (var i = 0; i < markers.length; i++) {
  authors = markers[i].getElementsByTagName('author')[0].innerHTML;
}
markers=xml.documentElement.getElementsByTagName(“书”);
对于(var i=0;i

希望对某人有所帮助:)

谢谢,Michal。我尝试了你的建议,但仍停留在上述问题中所述的两件事上。你能提供帮助吗?谢谢!你正在尝试访问存储xml(文本数据)的数组上的标记属性不是标记对象。很抱歉,在我的脚本中,我调用了我的对象数组标记,因此出现了混淆。您需要做的就是删除另一个数组以容纳google maps标记对象-将其称为gMarkers,并在创建标记时将每个标记推送到它。完成此操作后,您需要在scrollToMarker()中将标记的引用更改为gMarkers我还编辑了我的解决方案,向您展示了如何在bindInfoWindow()函数中直接绑定DOM事件,因此它是第一个解决方案的替代方案。谢谢您,Michal。所有这些都很有效!您是一位真正的专业人士!只是出于好奇,我如何能够使用您的第一个解决方案打开infoWindows?
markers = xml.documentElement.getElementsByTagName("book");

for (var i = 0; i < markers.length; i++) {
  authors = markers[i].getElementsByTagName('author')[0].innerHTML;
}