【发布时间】:2014-01-09 23:20:23
【问题描述】:
我编写了一个包含 Google 地图并使用“地点自动完成”的表单。在同一页面上,我有一个添加另一个位置的按钮,因此我添加了另一个地图画布 div 并尝试初始化地图的另一个副本。
我已将 Google Map javascript 修改如下,以便能够将变量传递给函数以附加到不同的元素:
<script>
function initialize(mapid) {
var mapOptions = {
center: new google.maps.LatLng(51.5112139, -0.1198244),
zoom: 9,
disableDefaultUI: true,
mapTypeControl: false,
scaleControl: true,
zoomControl: true,
zoomControlOptions: {
style: google.maps.ZoomControlStyle.SMALL
},
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById('map-canvas' + mapid),
mapOptions);
var input = (document.getElementById('input' + mapid));
var autocomplete = new google.maps.places.Autocomplete(input);
autocomplete.bindTo('bounds', map);
var infowindow = new google.maps.InfoWindow();
var marker = new google.maps.Marker({
map: map
});
google.maps.event.addListener(autocomplete, 'place_changed', function() {
infowindow.close();
marker.setVisible(false);
var place = autocomplete.getPlace();
if (!place.geometry) {
return;
}
if (place.geometry.viewport) {
map.fitBounds(place.geometry.viewport);
} else {
map.setCenter(place.geometry.location);
map.setZoom(17);
}
marker.setIcon(({
url: place.icon,
size: new google.maps.Size(71, 71),
origin: new google.maps.Point(0, 0),
anchor: new google.maps.Point(17, 34),
scaledSize: new google.maps.Size(35, 35)
}));
marker.setPosition(place.geometry.location);
marker.setVisible(true);
var address = '';
if (place.address_components) {
address = [
(place.address_components[0] && place.address_components[0].short_name || ''),
(place.address_components[1] && place.address_components[1].short_name || ''),
(place.address_components[2] && place.address_components[2].short_name || '')
].join(' ');
}
infowindow.setContent('<div><strong>' + place.name + '</strong><br>' + address);
infowindow.open(map, marker);
});
}
//google.maps.event.addDomListener(window, 'load', initialize);
$( document ).ready(function() {
initialize(1);
});
</script>
请注意,我注释掉了初始化地图的标准 Google 方式,并将其替换为 JQuery 方法,因为 Google 方式不喜欢该参数。
以上内容适用于为第一个地图加载页面,但是当我尝试使用以下on('click') 添加第二个地图时,初始化调用会破坏脚本。
$(function() {
var mapdiv = $('.parentclass');
var m = $('.parentclass div.well').size() + 1;
$('#addMap').on('click', function() {
$('<div class="well"><div id="map-canvas'+m+'" class="map-canvas"></div></div>').appendTo(mapdiv).hide().fadeIn('60');
initialize(m);
m++;
return false;
});
});;
如果我注释掉 initialize(m) 调用,它会创建空井,所以我知道调用是为了打破它。我已经确认 m 变量计算了已经存在的 .well div 的数量,它正确计算了正确的数字。那么,为什么在加载文档时 initialize(1) 工作,但在 'on('Click')` 函数上,它会在那里中断?
【问题讨论】:
-
错误是什么?
-
本身没有错误。但是页面会跳转到下一页(id="addMap" 附加到按钮上,这就是函数返回 false 的原因)。如果我注释掉
initialize(m),该函数将创建一个空井。 -
而按钮是
<form>中唯一的一个? -
不,还有
<button type="submit">也可以提交表单。 -
嗯。你能做jsfiddle吗?
标签: javascript jquery google-maps dynamic-data