1

我希望有人可以帮助我处理我的 Google Maps API 代码。

我已经设置了一个带有多个标记的地图,它可以成功运行,但是我想向标记添加点击事件,以便出现一个信息窗口,这就是我遇到问题的地方。

$(document).ready(function() {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = "http://maps.googleapis.com/maps/api/js?libraries=geometry&sensor=true&callback=mapInitialize";
    document.body.appendChild(script);
});
function mapInitialize() {
    var options = {  
        zoom: 5,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById('map_div'), options);
    geocoder = new google.maps.Geocoder();
    function codeAddress(markerValue, addressValue) {
        geocoder.geocode({ 'address': addressValue}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                map.setCenter(results[0].geometry.location);
                markerValue = new google.maps.Marker({
                    map: map,
                    position: results[0].geometry.location
                });
            }
        });
    }
    var marker1;
    codeAddress(marker1, '1 My Road, Somewhere, A1 1AA');
    var infowindow1 = new google.maps.InfoWindow({
        content: '<div class="infowindow"><strong><a href="http://mylink.com">Title</a></strong><br />Address details</div>'
    }); 
    google.maps.event.addListener(marker1, 'click', function() {
        infowindow1.open(map, marker1);  
    });
}

因此,当我包含 addListener 代码时,我收到错误“无法读取未定义的属性 ' _e3 '”。

我在这里阅读过类似问题的其他帖子,但我已经阅读了所有回复,即使他们有同样的问题,也没有一个对他们有用的解决方案对我有用,或者它们与我写的内容无关.

提前致谢。

4

1 回答 1

2

这里有多个问题:

  1. 您正在尝试通过分配给参数 name 来修改从函数内部marker1传递给codeAddress函数的变量markerValue。JavaScript 没有按引用传递的参数,因此marker1不会以任何方式受到您为markerValue. 所以稍后当你尝试用 做某事时marker1,它仍然有它的默认值 ( undefined)。

  2. Google Maps 的 API 是异步的。您的调用geocoder.geocode 启动了该过程,但它稍后完成,很久之后codeAddress才返回。

您需要将后续代码移入 codeAddress,特别是移入来自 的完成回调geocode

像这样的东西(完全未经测试,这个想法是为您指出正确的方向,而不是为您编写完美的解决方案):

function mapInitialize() {
    var options = {  
        zoom: 5,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById('map_div'), options);
    geocoder = new google.maps.Geocoder();
    function codeAddress(addressValue) {
        geocoder.geocode({ 'address': addressValue}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var marker, infowindow1;

                map.setCenter(results[0].geometry.location);
                marker = new google.maps.Marker({
                    map: map,
                    position: results[0].geometry.location
                });

                infowindow = new google.maps.InfoWindow({
                    content: '<div class="infowindow"><strong><a href="http://mylink.com">Title</a></strong><br />Address details</div>'
                }); 
                google.maps.event.addListener(marker, 'click', function() {
                    infowindow.open(map, marker);  
                });
            }
        });
    }
    codeAddress('1 My Road, Somewhere, A1 1AA');
}
于 2013-09-24T11:04:40.523 回答