缩放更改时,google maps v3 zoom_changed事件不会触发

时间:2010-10-28 16:11:04

标签: javascript google-maps

我正在按照我的预期加载v3 Google地图,而标记符合我的意图。但是,当我更改缩放时,我添加的zoom_changed事件似乎不会触发。有人能够阐明原因吗?我的代码如下。

function map_initialise() {
    var mapCentre = new google.maps.LatLng(53.75, -1.50);
    var mapOptions = {
        zoom: 6,
        center: mapCentre,
        mapTypeId: google.maps.MapTypeId.HYBRID
    }

    var map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);

    var latlong1 = new google.maps.LatLng(52.456550,1.680182);
    var windowtext1 = 'Some text';
    var popup1 = new google.maps.InfoWindow({
        content: windowtext1
    });
    var marker1 = new google.maps.Marker({
        position: latlong1,
        title: "Some text"
    });
    google.maps.event.addListener(marker1, 'click', function() { 
        popup1.open(map,marker1);
    });
    marker1.setMap(map);
}

google.maps.event.addDomListener(window, 'load', map_initialise);

google.maps.event.addListener(map, 'zoom_changed', function() {
    setTimeout(reCentre, 3000);
});

function reCentre() {
    var newcentre = new google.maps.LatLng(53.000,0.000);
    map.panTo(newcentre);
}

2 个答案:

答案 0 :(得分:11)

2件事......

  1. 现在你没有添加你的zoom_changed监听器,因为它是在初始化地图之前调用的。 Javascript执行map_initialise()函数,然后在地图加载完成之前立即尝试并添加侦听器。因此,最后将addListener放入initialize函数中。

  2. 您的map变量对map_initialise()函数是私有的,因此当调用reCentre()时,它无法看到您的地图对象。如果您从地图前删除var,它将变为全局,并且reCentre()将能够看到它。我建议在map_initialise()函数上方添加var map;,以便代码的读者看到地图是全局的。

答案 1 :(得分:2)

如果建议的解决方案有效,那可能只是一个与小而简单的地图相关的巧合。在大型混合地图上,它无法解决问题,实际上更复杂。 zoom_changed的监听器确实被添加,并在那一刻触发一次;然后,该侦听器的动作部分正确执行。但此后,每次单击缩放控件都会导致以下消息显示在Firefox的错误控制台中:

  

错误:g.e未定义
   来源档案:http://maps.gstatic.com/intl/en_us/mapfiles/api-3/10/20/main.js
   行:19

并且不执行侦听器操作。

如果包含“places”库(以支持搜索框),行为是相同的,但错误消息中的源文件是不同的:

  

错误:g.e未定义
   来源档案:http://maps.gstatic.com/cat_js/intl/en_us/mapfiles/api-3/10/20/%7Bmain,places%7D.js
   行:19

使建议的解决方案更加可疑的是,可以在zoom_changed侦听器之前添加标记和其他侦听器(用于在地图上和标记上“单击”),并且它们始终可靠地工作。