Подтвердить что ты не робот

Закройте все инфо-окна в API Карт Google v3

Я занят script, который сделает холст карт Google на моем сайте с несколькими маркерами. Я хочу, чтобы при щелчке по маркеру открылось окно. Я сделал это, и код в данный момент:

 var latlng = new google.maps.LatLng(-34.397, 150.644);
    var myOptions = {
      zoom: 8,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    function addMarker(map, address, title) {
     geocoder = new google.maps.Geocoder();
     geocoder.geocode( { 'address': address}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          map.setCenter(results[0].geometry.location);
          var marker = new google.maps.Marker({
     position: results[0].geometry.location,
              map: map,
              title:title
    });
    google.maps.event.addListener(marker, 'click', function() {
     var infowindow = new google.maps.InfoWindow();
            infowindow.setContent('<strong>'+title + '</strong><br />' + address);
             infowindow.open(map, marker);

          });
        } else {
          alert("Geocode was not successful for the following reason: " + status);
        }
     });
    }
    addMarker(map, 'Address', 'Title');
 addMarker(map, 'Address', 'Title');

Это работает 100%. Но теперь я хочу, чтобы, когда одна инфузия открыта, и вы хотите открыть вторую, первая автоматически закрывается. Но я не нашел способ сделать это. infowindow.close(); не поможет. У кого-нибудь есть пример или решение этой проблемы?

4b9b3361

Ответ 1

infowindow - это локальная переменная, и окно недоступно в момент закрытия()

var latlng = new google.maps.LatLng(-34.397, 150.644);
var infowindow = null;

...

google.maps.event.addListener(marker, 'click', function() {
    if (infowindow) {
        infowindow.close();
    }
    infowindow = new google.maps.InfoWindow();
    ...
});
...

Ответ 2

Объявить глобальные переменные:

var mapOptions;
var map;
var infowindow;
var marker;
var contentString;
var image;

В intialize используйте метод addEvent:

google.maps.event.addListener(map, 'click', function() {
    if (infowindow) {
        infowindow.close();
    }
});

Ответ 3

Для циклов, которые динамически создают infowindows, объявляют глобальную переменную

var openwindow;

а затем в вызове функции addListener (который находится внутри цикла):

google.maps.event.addListener(marker<?php echo $id; ?>, 'click', function() {
if(openwindow){
    eval(openwindow).close();
}
openwindow="myInfoWindow<?php echo $id; ?>";
myInfoWindow<?php echo $id; ?>.open(map, marker<?php echo $id; ?>);
});

Ответ 4

У меня был динамический цикл, который создавал infowindows и маркеры на основе того, сколько из них было введено в CMS, поэтому я не хотел создавать новый InfoWindow() при каждом щелчке события и подталкивать его запросами, если это когда-либо возникло. Вместо этого я попытался понять, какая конкретная переменная infowindow для каждого экземпляра будет отсутствовать из заданного количества мест, которые у меня были, а затем предложила Maps закрыть все из них до того, как она откроет правильный.

Мой массив местоположений назывался местоположениями, поэтому PHP я установил до фактическую инициализацию карт, чтобы получить мои имена переменных infowindow:

for($k = 0; $k < count($locations); $k++) {
        $infowindows[] = 'infowindow' . $k; 
} 

Затем после инициализации карты и т.д. в script у меня был цикл PHP foreach, создающий динамические информационные окна с помощью счетчика:

//...javascript map initilization
<?php 
$i=0;
foreach($locations as $location) {

    ..//get latitudes, longitude, image, etc...

echo 'var mapMarker' . $i . ' = new google.maps.Marker({
          position: myLatLng' . $i . ',
          map: map,
          icon: image
      });';

echo 'var contentString' . $i . ' = "<h1>' . $title[$i] . '</h1><h2>' . $address[$i] . '</h2>' . $content[$i] .         '";'; 
echo 'infowindow' . $i . ' = new google.maps.InfoWindow({ ';
echo '    content: contentString' . $i . '
          });';

echo 'google.maps.event.addListener(mapMarker' . $i . ', "click", function() { ';   
    foreach($infowindows as $window) {  
        echo $window . '.close();'; 
    }
        echo 'infowindow' . $i . '.open(map,mapMarker'. $i . ');
      });';

$i++; 
}
?>
...//continue with Maps script... 

Итак, до того, как я назвал всю карту script, у меня был массив с именами, которые, как я знал, будут выводиться при создании InfoWindow(), например infowindow0, infowindow1, infowindow2, etc...

Затем, в событии click для каждого маркера, цикл foreach проходит и говорит закрыть все из них, прежде чем вы выполните следующий шаг по их открытию. Оказывается, выглядит так:

google.maps.event.addListener(mapMarker0, "click", function() {
    infowindow0.close();
    infowindow1.close();
    infowindow2.close();
    infowindow0.open(map,mapMarker0);
}

Просто другой способ делать то, что я предполагаю... но я надеюсь, что это поможет кому-то.

Ответ 5

У меня есть что-то вроде следующего

function initMap()
{
    //...create new map here
    var infowindow;
    $('.business').each(function(el){
        //...get lat/lng
        var position = new google.maps.LatLng(lat, lng);
        var content = "contents go here";
        var title = "titleText";
        var openWindowFn;
        var closure = function(content, position){.
            openWindowFn = function()
            {
                if (infowindow)
                {
                    infowindow.close();
                }
                infowindow = new google.maps.InfoWindow({
                    position:position,
                    content:content
                });
                infowindow.open(map, marker);
            }
        }(content, position);
        var marker = new google.maps.Marker({
            position:position,
            map:map,
            title:title.
        });
        google.maps.event.addListener(marker, 'click', openWindowFn);
    }
}

В моем понимании использование такого закрытия позволяет захватывать переменные и их значения во время объявления функции, а не полагаться на глобальные переменные. Поэтому, когда openWindowFn вызывается позже, например, на первом маркере переменные content и position имеют значения, которые они выполняли во время первой итерации в функции each().

Я не уверен, как openWindowFn имеет infowindow в своей области. Я также не уверен, что делаю все правильно, но он работает даже с несколькими картами на одной странице (каждая карта получает одно открытое окно).

Если у кого-нибудь есть идеи, прокомментируйте.

Ответ 6

Я рекомендую вам попробовать goMap плагин jQuery при работе с Картами Google. Для такой ситуации вы можете установить hideByClick в true при создании маркеров:

$(function() { 
    $("#map").goMap({ 
        markers: [{  
            latitude: 56.948813, 
            longitude: 24.704004, 
            html: { 
                content: 'Click to marker', 
                popup:true 
            } 
        },{  
            latitude: 54.948813, 
            longitude: 21.704004, 
            html: 'Hello!' 
        }], 
        hideByClick: true 
    }); 
}); 

Это всего лишь один пример: у него есть много функций, которые можно предложить, например, группировать маркеры и манипулировать информационными окнами.

Ответ 7

Вам нужно нажать на свою карту - $('#map-selector').click();

Ответ 8

При работе с маркерными кластерами это работало для меня.

var infowindow = null;

google.maps.event.addListener(marker, "click", function () {

        if (infowindow) {
            infowindow.close();
        }
        var markerMap = this.getMap();
        infowindow = this.info;
        this.info.open(markerMap, this);


    });