Показывать только одну инфопузырь "за раз" в API карт Google 3
Я пытаюсь сделать так, чтобы за раз показывался только один инфопузырь, другими словами, переключать инфопузырь. Маркер получает этот обработчик события в цикле for, проходящем через массив маркеров.
на данный момент это работает таким образом, что открывает инфопузырь, но никогда не закрывает его. Я могу щелкнуть по нескольким маркерам, и каждый будет иметь инфопузырь без закрытия предыдущего.
Iv попытался добавить infobuble2.close();
но закрытие, которое я получил с этим, я должен был бы щелкнуть по маркерам дважды, чтобы закрыть предыдущие инфопузыри.
Iv также пытался проверить, если infobubble открыт с помощью infoBubble2.isOpen()
кажется, что это только ложь.
И да, если вам интересно, я попробовал infowindow, и функциональность хорошо работает с ним, но из-за ограничений дизайна мне нужно стилизовать всплывающее окно, соответственно ниже мой код
var infoBubble2;
google.maps.event.addListener(marker, 'click', function() {
infoBubble2 = new InfoBubble({
map: map,
position: new google.maps.LatLng(-35, 151),
shadowStyle: 1,
padding: 0,
backgroundColor: 'rgb(255,255,255)',
borderRadius: 4,
arrowSize: 10,
borderWidth: 1,
borderColor: '#2c2c2c',
disableAutoPan: true,
hideCloseButton: !0,
arrowPosition: 30,
backgroundClassName: 'phoney',
arrowStyle: 2
});
infoBubble2.setContent("some content");
infoBubble2.open(map, marker);
});
3 ответа
Я решил это, объявив переменную infobubble2 вне функции initialize(), а затем присвоив ей значение new infobubble (); в пределах initialize () открывается событие onclick, присваиваемое каждому маркеру, и заполняет содержимое инфопузырька.
Ниже то, что я сделал. Спасибо всем за помощь.
var infoBubble2;
function initialize() {
var myOptions = {
zoom: zoom,
minZoom: 0, maxZoom: 20,
center: myLatLng,
mapTypeId: maptype,
mapTypeControl:false,
streetViewControl:false,
panControl:false
};
map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
infoBubble2 = new InfoBubble({
map: map,
position: new google.maps.LatLng(-35, 151),
shadowStyle: 1,
padding: 0,
backgroundColor: 'rgb(255,255,255)',
borderRadius: 4,
arrowSize: 10,
borderWidth: 1,
borderColor: '#2c2c2c',
disableAutoPan: true,
hideCloseButton: !0,
arrowPosition: 30,
backgroundClassName: 'phoney',
arrowStyle: 2
});
$.getJSON('include/jsonCatPoints.php', function(data) {
for(var i=0; i<data.length;i++){
placeMarker(data[i]['cat_lat'], data[i]['cat_long'], map);
}
});
}//ends initialize
function placeMarker(lat, longg, map) {
var image = 'img/cat_marker.png';
marker = new google.maps.Marker({
position: new google.maps.LatLng(lat,longg),
map: map,
icon: image
});
makeBubble(map, "test" +lat, marker);
markers.push(marker);
}//ends placeMarker
function makeBubble(map, contentString, marker) {
google.maps.event.addListener(marker, 'click', function() {
infoBubble2.setContent("message"+contentString);
infoBubble2.open(map, marker)
});
}// ends makeBubble
Попробуйте что-то вроде этого:
function f_createBalloon(num, marker) {
balloons[num] = new google.maps.InfoWindow({
content: ballonInfo[num]
});
balloonListeners[num] = new google.maps.event.addListener(marker, 'click',
function () {
f_closeBalloons();
balloons[num].open(map, marker);
});
}
function f_closeBalloons() {
for (var j in balloons) {
if (balloons[j]) balloons[j].close(map, markers[j]);
}
}
Если вы хотите, чтобы только один отображался одновременно, то создайте только один объект и используйте его повторно, вместо того, чтобы постоянно создавать новые объекты и пытаться управлять ими, например:
var infoBubble2 = new InfoBubble({
map: map,
position: new google.maps.LatLng(-35, 151),
shadowStyle: 1,
padding: 0,
backgroundColor: 'rgb(255,255,255)',
borderRadius: 4,
arrowSize: 10,
borderWidth: 1,
borderColor: '#2c2c2c',
disableAutoPan: true,
hideCloseButton: !0,
arrowPosition: 30,
backgroundClassName: 'phoney',
arrowStyle: 2
});
google.maps.event.addListener(marker,'click',function() {
infoBubble2.close();
infoBubble2.setContent("some content");
infoBubble2.open(map, marker);
});