当只有一个标记存在时,Google地图InfoWindow会打开

时间:2016-08-16 00:28:09

标签: javascript wordpress google-maps google-maps-api-3 advanced-custom-fields

我正在使用高级自定义字段(ACF)Google地图地址并创建包含多个标记和单个InfoWindow的Google地图。然后根据哪个标记处于活动状态来交换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');样式函数的每种组合。

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>

0 个答案:

没有答案