簡體   English   中英

只有一個標記時會打開Goog​​le Maps InfoWindow

[英]Google Maps InfoWindow Open When Only One Marker is Present

我要使用高級自定義字段(ACF)Google地圖地址,並創建一個具有多個標記和單個InfoWindow的Google Map。 然后根據哪個標記處於活動狀態來交換該InfoWindow的內容。

通過ACF設置了PHP $location數組,並且javascript循環運行並運行到Google Maps API。

我只想在只有一個標記時默認打開InfoWindow。

我已經弄清楚了如何確定new_map函數結尾是否只有一個標記…

if($markers.length == 1) {
    console.log('yes');
}

但是,我不確定在地圖渲染后如何調用/如何訪問Google Maps API。

我認為我的問題與范圍有關,因為我嘗試了google.maps.event.trigger()google.maps.Map.event.trigger(marker, 'click');每種組合google.maps.Map.event.trigger(marker, 'click'); 我能想到的樣式功能。

Array
(
    [address] => 123 Hamaker Rd, Manheim, PA, United States
    [lat] => 40.1789636
    [lng] => -76.3852963
)



<script type="text/javascript">
(function($) {

  /*
  *  new_map
  *
  *  This function will render a Google Map onto the selected jQuery element
  *
  *  @type function
  *  @date 8/11/2013
  *  @since   4.3.0
  *
  *  @param   $el (jQuery element)
  *  @return  n/a
  */

  /*
  * Modified from ACF Documentation, here are some links
  * http://support.advancedcustomfields.com/forums/topic/multiple-post-points-on-google-maps/
  * http://fancysquares.com/google-maps-infowindow-advanced-custom-fields-acf/
  */

  function new_map( $el ) {

     // var
     var $markers = $el.find('.marker');

     // vars
     var args = {
        zoom     : 16,
        center      : new google.maps.LatLng(0, 0),
        mapTypeId   : google.maps.MapTypeId.ROADMAP,
        scrollwheel : false,
        mapTypeControl: false,
        streetViewControl: false,
     };

     // create map           
     var map = new google.maps.Map( $el[0], args);

     // add a markers reference
     map.markers = [];

     // add markers
     $markers.each(function(){
        add_marker( $(this), map );
     });

     // center map
     center_map( map );

     /* Conditional works to find if it only has one marker, but I can't figure out what to trigger */
     //console.log($markers);

     if($markers.length == 1) {
        console.log('yes');
     }

  }

  var infowindow = new google.maps.InfoWindow({
     content     : '' 
  });

  /*
  *  add_marker
  *
  *  This function will add a marker to the selected Google Map
  *
  *  @type function
  *  @date 8/11/2013
  *  @since   4.3.0
  *
  *  @param   $marker (jQuery element)
  *  @param   map (Google Map object)
  *  @return  n/a
  */

  function add_marker( $marker, map ) {

     // var
     var latlng = new google.maps.LatLng( $marker.attr('data-lat'), $marker.attr('data-lng') );

     // create marker
     var marker = new google.maps.Marker({
        position : latlng,
        map         : map,
        open     : true
     });

     // add to array
     map.markers.push( marker );

     // if marker contains HTML, add it to an infoWindow
     if( $marker.html() ) {

        // show info window when marker is clicked & close other markers
        google.maps.event.addListener(marker, 'click', function() {
           //swap content of that singular infowindow
           infowindow.setContent($marker.html());
           infowindow.open(map, marker);
        });

        // close info window when map is clicked
        google.maps.event.addListener(map, 'click', function(event) {
           if (infowindow) {
              infowindow.close();
           }
        }); 

     }
  }

  /*
  *  center_map
  *
  *  This function will center the map, showing all markers attached to this map
  *
  *  @type function
  *  @date 8/11/2013
  *  @since   4.3.0
  *
  *  @param   map (Google Map object)
  *  @return  n/a
  */

  function center_map( map ) {

     // vars
     var bounds = new google.maps.LatLngBounds();

     // loop through all markers and create bounds
     $.each( map.markers, function( i, marker ){

        var latlng = new google.maps.LatLng( marker.position.lat(), marker.position.lng() );

        bounds.extend( latlng );

     });

     // only 1 marker?
     if( map.markers.length == 1 ) {
        // set center of map
         map.setCenter( bounds.getCenter() );
         map.setZoom( 10 );
     }
     else {
        // fit to bounds
        map.fitBounds( bounds );
     }
  }


  /*  This function will render each map when the document is ready (page has loaded)
  *
  *  @type function
  *  @date 8/11/2013
  *  @since   5.0.0
  *
  *  @param   n/a
  *  @return  n/a
  */
  // global var
  var map = null;

  $(document).ready(function(){
     $('.acf-map').each(function(){
        // create map
        map = new_map( $(this) );
     });

  });

})(jQuery);
</script>

在new_map函數中,可以在添加標記之前檢查數組的長度。 如果長度為1,則傳遞一個參數,指示showInfoWindow為true,否則為false。

var showInfoWindow = false;
if($markers.length == 1) {
        showInfoWindow = true
     }

 // add markers
     $markers.each(function(){
        add_marker( $(this), map , showInfoWindow);
     });

然后按如下所示修改add_marker代碼

function add_marker( $marker, map, showInfoWindow ) {

 // var
 var latlng = new google.maps.LatLng( $marker.attr('data-lat'), $marker.attr('data-lng') );

 // create marker
 var marker = new google.maps.Marker({
    position : latlng,
    map         : map,
    open     : true
 });

 // add to array
 map.markers.push( marker );

 // if marker contains HTML, add it to an infoWindow
 if( $marker.html() ) {

    // show info window when marker is clicked & close other markers
    google.maps.event.addListener(marker, 'click', function() {
       //swap content of that singular infowindow
       infowindow.setContent($marker.html());
       infowindow.open(map, marker);
    });

    // close info window when map is clicked
    google.maps.event.addListener(map, 'click', function(event) {
       if (infowindow) {
          infowindow.close();
       }
    }); 

  if(showInfoWindow)
  {
       infowindow.setContent($marker.html());
       infowindow.open(map, marker);
  }

 }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM