我正在按照我的预期加载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);
}
答案 0 :(得分:11)
2件事......
现在你没有添加你的zoom_changed监听器,因为它是在初始化地图之前调用的。 Javascript执行map_initialise()函数,然后在地图加载完成之前立即尝试并添加侦听器。因此,最后将addListener放入initialize函数中。
您的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侦听器之前添加标记和其他侦听器(用于在地图上和标记上“单击”),并且它们始终可靠地工作。