好的,所以我有一张地图,上面有一些标记。地图上有一个点击事件应该获得最近的标记,但是当 find_closest_marker(event) 函数运行时,它会在 map.markers.length 上中断,说它未定义。
这是我尝试http://jsfiddle.net/VyzFq/7/的链接
任何人都可以请告诉我我哪里出错了。
看起来有几个问题:
1) 尚未声明 map.markers 数组。在 for 循环上方声明它,并将标记推送到标记数组上。
...
var infowindow = new google.maps.InfoWindow();
var marker, i;
map.markers = []; // ADD THIS LINE
for (i = 0; i < locations.length; i++) {
marker = new google.maps.Marker({
position: new google.maps.LatLng(locations[i][1], locations[i][2]),
map: map
});
map.markers.push(marker); // ADD THIS LINE
...
Run Code Online (Sandbox Code Playgroud)
2)find_closest_point 函数看不到map 变量。将 find_closest_point 函数移动到要添加单击事件侦听器的范围:
// CHANGE THIS LINE
google.maps.event.addListener(map, 'click', find_closest_marker);
// TO:
google.maps.event.addListener(map, 'click', function( event ) {
var lat = event.latLng.lat();
var lng = event.latLng.lng();
var R = 6371;
var distances = [];
var closest = -1;
for( i=0;i<map.markers.length; i++ ) {
var mlat = map.markers[i].position.lat();
var mlng = map.markers[i].position.lng();
var dLat = rad(mlat - lat);
var dLong = rad(mlng - lng);
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(rad(lat)) * Math.cos(rad(lat)) * Math.sin(dLong/2) * Math.sin(dLong/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
distances[i] = d;
if ( closest == -1 || d < distances[closest] ) {
closest = i;
}
}
alert(map.markers[closest].title);
});
Run Code Online (Sandbox Code Playgroud)