我正在关注使用jQuery将Google Maps API集成到我们网站的SitePoint教程,并且我已经完成了所有工作,但有一个例外:每个新标记打开一个单独的信息窗口,而不关闭前一个。我正在试图弄清楚如何一次只打开一个窗口。
以下是相关教程:http://www.sitepoint.com/google-maps-api-jquery/
我在这里检查了这个问题:Have just one InfoWindow open in Google Maps API v3但是我无法通过回答问题来解决我的问题(我可能很容易被误解)。
我的代码如下所示:
$(document).ready(function(){
var MYMAP = {
map: null,
bounds: null
}
MYMAP.init = function(selector, latLng, zoom) {
var myOptions = {
zoom:zoom,
center: latLng,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
this.map = new google.maps.Map($(selector)[0], myOptions);
this.bounds = new google.maps.LatLngBounds();
}
MYMAP.placeMarkers = function(filename) {
$.get(filename, function(json){
$.each(json, function(i,loc){
var marker = new google.maps.Marker({
position: new google.maps.LatLng(loc.location.merchant_location.latitude, loc.location.merchant_location.longitude),
map: MYMAP.map,
title: loc.deal.subject
});
var arrMarkers = [];
arrMarkers[i] = marker;
var infoWindow = new google.maps.InfoWindow({
content: "<h3>" + loc.deal.subject + "</h3><p>" + loc.location.merchant_location.address + "</p>"
});
var arrInfoWindows = [];
arrInfoWindows[i] = infoWindow;
google.maps.event.addListener(marker, 'click', function(){
infoWindow.open(MYMAP.map,marker);
});
});
}, "json");
}
$("#map").css({
height: 500,
width: 600
});
var myLatLng = new google.maps.LatLng(#{@deals.first.merchant_locations.first.latitude},#{@deals.first.merchant_locations.first.longitude});
MYMAP.init('#map', myLatLng, 11);
MYMAP.placeMarkers('/more_deals/get_locations/#{@market.id}');
});
感谢任何帮助。感谢
答案 0 :(得分:3)
您正在.each()循环中创建infowindow。相反,用该循环创建一个infowindow。然后在您的事件监听器中,每次只更新该全局信息窗口的内容。
MYMAP.init = function(selector, latLng, zoom) {
var myOptions = {
zoom:zoom,
center: latLng,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
this.map = new google.maps.Map($(selector)[0], myOptions);
this.bounds = new google.maps.LatLngBounds();
}
MYMAP.placeMarkers = function(filename) {
$.get(filename, function(json){
var infoWindow = new google.maps.InfoWindow({
content: ""
});
$.each(json, function(i,loc){
var marker = new google.maps.Marker({
position: new google.maps.LatLng(loc.location.merchant_location.latitude, loc.location.merchant_location.longitude),
map: MYMAP.map,
title: loc.deal.subject
});
bindInfoWindow(marker, MYMAP.map, infoWindow, "<h3>" + loc.deal.subject + "</h3><p>" + loc.location.merchant_location.address + "</p>");
});
}, "json");
}
function bindInfoWindow(marker, map, infowindow, html) {
google.maps.event.addListener(marker, 'click', function() {
infowindow.setContent(html);
infowindow.open(map, marker);
});
}
$("#map").css({
height: 500,
width: 600
});
var myLatLng = new google.maps.LatLng(#{@deals.first.merchant_locations.first.latitude},#{@deals.first.merchant_locations.first.longitude});
MYMAP.init('#map', myLatLng, 11);
MYMAP.placeMarkers('/more_deals/get_locations/#{@market.id}');
答案 1 :(得分:0)
仅创建一个InfoWindow对象。 您修改过的代码。
MYMAP.init = function(selector, latLng, zoom) {
var myOptions = {
zoom:zoom,
center: latLng,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
this.map = new google.maps.Map($(selector)[0], myOptions);
this.bounds = new google.maps.LatLngBounds();
}
MYMAP.placeMarkers = function(filename) {
var infoWindow = new google.maps.InfoWindow();
$.get(filename, function(json){
$.each(json, function(i,loc){
var marker = new google.maps.Marker({
position: new google.maps.LatLng(loc.location.merchant_location.latitude, loc.location.merchant_location.longitude),
map: MYMAP.map,
title: loc.deal.subject
});
var arrMarkers = [];
arrMarkers[i] = marker;
google.maps.event.addListener(marker, 'click', function(){
infoWindow.setContent (
"<h3>" + loc.deal.subject + "</h3><p>" + loc.location.merchant_location.address + "</p>"
);
infoWindow.open(MYMAP.map,marker);
});
});
}, "json");
}
$("#map").css({
height: 500,
width: 600
});