javascript - 仅存在一个标记时 Google map 信息窗口打开

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

我正在采用高级自定义字段 (ACF) Google map 地址,并创建一个包含多个标记和单个信息窗口的 Google map 。然后,根据哪个标记处于事件状态,交换该信息窗口的内容。

通过 ACF 设置 PHP $location 数组,JavaScript 循环并运行到 Google Maps API。

当只有一个标记时,我想默认打开信息窗口。

我已经弄清楚如何确定 new_map 函数末尾是否只有一个标记...

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

但我不确定 map 渲染后要调用什么/如何访问 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>

最佳答案

在 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);
  }

 }
}

关于javascript - 仅存在一个标记时 Google map 信息窗口打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38964909/

相关文章:

javascript - 需要帮助让 Google map DirectionPanel 在 FancyBox 中显示

javascript - 当子数组具有特定值时删除数组元素

javascript - 如何修复 WordPress 中的 "undefined is not a function"

MySQL sql转储错误的字符编码

javascript - 如何检查数组对象在 for 循环中是否完成

java - 尝试使用 Maps API 查找附近地点时出现 FileNotFoundException

javascript - 如何在脚本中的 link_to 标记内使用 javascript 变量?

javascript - Angular 嵌套 FormArray

javascript - 如何将 onchange 上的值传递给 jquery 中的另一个 onchange 事件

php - 结帐时的 Woocommerce 自定义产品字段