【问题标题】:Google Maps info windows only displays info from the first click谷歌地图信息窗口只显示第一次点击的信息
【发布时间】:2015-03-16 15:20:13
【问题描述】:

我有一个脚本:

  1. 以 XML 文件的形式从数据库中提取结果
  2. 解析这些结果
  3. 为每个结果创建一个标记并将其放置在地图上(所有标记的单个地图)
  4. 同时,构建一个包含所有这些结果的可点击 HTML 列表(侧边栏)。

当用户点击侧边栏中的地名时,地图上相应标记的信息窗口会自动显示。当然用户也可以直接点击地图上的标记,同样的信息窗口也会显示出来。

这段代码已经运行了好几年了,但上周我注意到它的行为现在被窃听了。查看某些给定结果时,第一次点击(在地图上或边栏中)工作正常(信息窗口打开并显示正确的信息),但以下点击均显示来自第一次点击的相同信息,都在各自的信息窗口中。 (需要明确:显示的信息是第一次点击的信息,而不是前一次点击的信息。)

我已经尝试调试了好几个小时,但我不明白为什么它不再工作了。正如您在下面的代码中看到的那样,我尝试在google.maps.event.addListener 函数中添加console.log,以查看单击标记时正在处理哪些数据,但即使在那里,我也没有发现任何错误。

这是我的代码(简化为更具可读性):

var side_bar_html = '\n';
var gmarkers = []; // array for created markers
var infoWindow;
var center_lat = <?php echo $position_lat; ?>;
var center_lng = <?php echo $position_lng; ?>;

function createMarker(point, name, html, place_id, map) {
    var marker, markerOptions;
    markerOptions = {
        map: map,
        position: point,
        dataId: place_id,
        icon  : 'theme/marker.png',
        shadow: 'theme/marker_shadow.png'
    };
    marker = new google.maps.Marker(markerOptions);

    infoWindow = new google.maps.InfoWindow({content: html});
    google.maps.event.addListener(marker, 'click', function() {
        console.log(this, marker, html);
        infoWindow.content = html;
        infoWindow.open(map, this);
    });

    gmarkers.push(marker);
    side_bar_html += '\n<li><a href="javascript:showPlace(' + (gmarkers.length-1) + ')" id="sr' + place_id + '">' + name + '</a></li>';
    return marker;
}

function showPlace(i) {
    google.maps.event.trigger(gmarkers[i], 'click');
}

function loadEarth(opt, zoom) {
    var map, point, mapCenter, mapOptions;
    if (zoom === null) {zoom = 7;}
    mapCenter = new google.maps.LatLng(center_lat, center_lng);
    mapOptions = {
        zoom: zoom,
        center: mapCenter,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    map   = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
    point = new google.maps.LatLng(parseFloat(center_lat), parseFloat(center_lng));
    if (opt != 0) {
        map.setMap(new google.maps.Marker(point));
    }
}

// receiving results via XML
function go() {
    var map, bounds;
    var mapOptions = {
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
    bounds = new google.maps.LatLngBounds();

    $.ajax({
        url : 'url/to/data.xml',
        type : 'GET',
        dataType : 'xml',
        success : function(xml) {
            var markers, lat, lng, place_id, point, label, html, marker;
            markers = xml.documentElement.getElementsByTagName("marker");
            for (var i = 0; i < markers.length; i++) {
                // extract data for each marker
                lat =     parseFloat(markers[i].getAttribute("lat"));
                lng =     parseFloat(markers[i].getAttribute("lng"));
                place_id = parseFloat(markers[i].getAttribute("place_id"));
                point = new google.maps.LatLng(lat,lng);
                label = $(markers[i]).find('label').eq(0).text();
                html  = $(markers[i]).find('infowindow').eq(0).text();

                // marker creation
                marker = createMarker(point, label, html, place_id, map);
                // extend visible zone to newly added marker
                bounds.extend(point);
            }
            map.setCenter(new google.maps.LatLng(center_lat, center_lng), 7);
            bounds.extend(point);
            if (markers.length>0) {
                document.getElementById("side_results").innerHTML = side_bar_html;
                map.fitBounds(bounds);
                map.setCenter(bounds.getCenter());
            } else {
                loadEarth();
            }
        } // end AJAX success
    }); // end AJAX
} // end go()

if ($('#places_page').is('.empty')) {
    loadEarth(0,8);
} else go();

任何帮助将不胜感激。

编辑:

根据要求,这里是收到的 XML 示例。在这种情况下,脚本开头的 PHP 变量将收到以下值:

$position_lat: 46.9479222
$position_lng: 7.4446085

<?xml version="1.0" encoding="UTF-8"?><markers>
<marker place_id="955" lat="46.950218" lng="7.442429">
    <label><![CDATA[<em>Place 955</em><strong>3011 Bern</strong>]]></label>
    <infowindow>
        <![CDATA[<p><em>Place 955</em><br />Speichergasse 35<br />3011 <ins>Bern</ins></p>]]>
    </infowindow>
</marker>
<marker place_id="985" lat="46.942032" lng="7.389993">
    <label><![CDATA[<em>Place 985</em><strong>3018 Bern</strong>]]></label>
    <infowindow>
        <![CDATA[<p><em>Place 985</em><br />Brünnenstrasse 106A<br />3018 <ins>Bern</ins></p>]]>
    </infowindow>
</marker>
</markers>

Google Maps API 包含在此行中:
&lt;script src="http://maps.google.com/maps/api/js?v=3&amp;sensor=true&amp;language=fr&amp;key=..."&gt;&lt;/script&gt;

编辑 2:

更改 API 调用以强制其使用 3.18 版确实可以解决问题
&lt;script src="http://maps.google.com/maps/api/js?v=3.18&amp;sensor=true&amp;language=fr&amp;key=..."&gt;&lt;/script&gt;

显然这是一个临时修复,因为 v. 3.18 并不总是可用。现在我需要了解 3.19 版本的哪些变化导致了这个 bug 的出现。任何建议仍然受到赞赏。 :)

【问题讨论】:

  • 您能否提供示例 xml(用于运行您的代码的 sn-p,因此它将演示问题)?您如何包含 API(您使用的是实验版本还是其他版本)? My (admittedly very simple) example 似乎工作正常。
  • 好的,我已经编辑了我的问题来回答你的问题。我认为问题不在于解析 XML,因为第一次单击确实有效,而且据我所知,在 ajax 成功函数中正确检索了 XML 中的每个标记。 (可以肯定的是,我会再次测试。)
  • (顺便说一句,您的链接没有响应。(连接超时。))
  • 注意: 是的,我控制台记录了它,我可以确认所有标记信息都从 for 循环中的 XML 文件中正确提取。

标签: javascript google-maps google-maps-api-3 google-maps-markers


【解决方案1】:

这种未记录的用法:

infoWindow.content = html;

可能是问题所在。应该是:

infoWindow.setContent(html);

.content 属性已消失或不再受支持issue

【讨论】:

  • 感谢您的提示。我纠正了这一点,但它并没有解决我的问题。不过,有趣的是,二月份的更新打破了一些东西。我会检查完整的更改日志,看看我是否找到任何线索。或者也许我可以更改 API 调用以强制使用以前的版本? (不确定是否可行,我会尝试。)
  • 哦,我的错,这确实是问题的原因!但在我的完整代码中,我在两个地方使用了该行,起初我只更正了其中一个。纠正它们都解决了问题。非常感谢!
猜你喜欢
  • 2013-06-08
  • 2016-12-21
  • 2012-02-18
  • 2014-09-17
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
相关资源
最近更新 更多