当前位置: 首页 > 知识库问答 >
问题:

如何使用GoogleMapsJavaScriptAPI V3设置infoWindow加载内容

庄星汉
2023-03-14

现在,我正在为一个客户的网站开发“位置”页面,该页面将他们四个位置的名称显示为链接。链接列表下面是谷歌地图画布,其中为每个位置添加了标记和信息窗口。加载时,地图默认为第一个位置标记的位置,并且应该打开该标记的infoWindow。单击位置名称应该平移地图到相应的标记,并打开infoWindow。

我使用的谷歌地图示例非常准确-http://wrightshq.com/playground/placing-multiple-markers-on-a-google-map-using-api-3/ 我已经把地图注释掉了;线和整个边界都在下面。代替监听器,我添加了map.panTo()以转到第一个标记的位置,并在mapOptions中添加了zoom:14。以下是我的全部代码:

function initialize() {
    var map;
    var bounds = new google.maps.LatLngBounds();

    // Define some styles for the colors/look.
    // Generate styles here: http://gmaps-samples-v3.googlecode.com/svn/trunk/styledmaps/wizard/index.html
    var styles = [ { "featureType": "landscape.man_made", "elementType": "geometry", "stylers": [ { "color": "#abce80" } ] },{ "featureType": "landscape.natural", "elementType": "geometry", "stylers": [ { "color": "#749f71" } ] },{ "featureType": "road", "elementType": "geometry", "stylers": [ { "color": "#99c26e" }, { "weight": 0.6 } ] },{ "featureType": "road.highway", "elementType": "geometry", "stylers": [ { "color": "#eaf5a1" }, { "weight": 1.5 } ] },{ "featureType": "road", "elementType": "labels.text.fill", "stylers": [ { "color": "#5b5b3e" } ] },{ "featureType": "road", "elementType": "labels.text.stroke", "stylers": [ { "color": "#a9d07f" } ] },{ "featureType": "poi", "elementType": "labels.text.stroke", "stylers": [ { "color": "#f5ffa8" } ] },{ "featureType": "water", "elementType": "geometry", "stylers": [ { "color": "#aee3e0" } ] },{ "featureType": "poi", "elementType": "geometry", "stylers": [ { "color": "#806e4e" }, { "lightness": 27 } ] },{ } ];

    var mapOptions = {
        mapTypeId: 'roadmap',
        styles: styles,
        zoom:14
    };

    // Display a map on the page
    map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);

    // Multiple Markers
    var markers = [
    <?php if( get_field('locations') ): ?>
        <?php while( has_sub_field('locations') ): $map_info = get_sub_field('map_location'); ?>
        ['<?php echo $map_info['address'] ?>',<?php echo $map_info['lat'] ?>,<?php echo $map_info['lng'] ?>],
        <?php endwhile; ?>
    <?php endif; ?>
    ];
    mapCenter = new google.maps.LatLng(markers[0][1],markers[0][2]);
    //console.log(mapCenter);

    // Info Window Content
    var infoWindowContent = [
    <?php if( get_field('locations') ): ?>
        <?php while( has_sub_field('locations') ): ?>
        ['<div class="google-map-tooltip">' +
        '<strong><?php echo get_sub_field('pin_heading'); ?></strong>' +
        '<p><?php echo str_replace('<br />','<br />\\',get_sub_field('address')); ?></p>' +
        '</div>'],
        <?php endwhile; ?>
    <?php endif; ?>

    ];

    // Display multiple markers on a map
    var infoWindow = new google.maps.InfoWindow(), marker, i;

    // Loop through our array of markers & place each one on the map  
    for( i = 0; i < markers.length; i++ ) {
        var position = new google.maps.LatLng(markers[i][1], markers[i][2]);
        bounds.extend(position);
        marker = new google.maps.Marker({
            position: position,
            map: map,
            title: markers[i][0],
            icon: '<?php echo IMAGES; ?>/icon-map-marker.png',
        });

        if( i==0 ){ first_marker = marker; }

        // Allow each marker to have an info window    
        google.maps.event.addListener(marker, 'click', (function(marker, i) {
            return function() {
                infoWindow.setContent(infoWindowContent[i][0]);
                infoWindow.open(map, marker);
            }
        })(marker, i));

        // Automatically center the map fitting all markers on the screen
        //map.fitBounds(bounds);
    }


        //Move map to first tab's location
        map.panTo(mapCenter);
        console.log(first_marker);
        infoWindow.open(map,first_marker);

    // Override our map zoom level once our fitBounds function runs (Make sure it only runs once)
    /*var boundsListener = google.maps.event.addListener((map), 'bounds_changed', function(event) {

        this.setZoom(14);
        google.maps.event.removeListener(boundsListener);
    });*/

}//END initialize()
google.maps.event.addDomListener(window, 'load', initialize);

代码的工作原理是添加标记,并且贴图从正确的标记开始。如果单击标记,将显示正确的信息窗口。然而,我希望发生的是,不仅地图从第一个标记位置开始,而且还需要打开标记信息窗口。正如您在该示例代码中所注意到的,问题在于,在标记的click listener中调用infoWindow.setContent()之前,infoWindow内容永远不会被设置。换句话说,在单击信息窗口之前,它们实际上没有任何内容。因此,当我尝试在地图第一次显示时在第一个标记上使用infoWindow.open()时,它从技术上打开了infoWindow,但您只看到工具提示点,而没有工具提示气泡的其余部分,因为内容还没有通过单击事件添加。

在将标记声明为新的标记对象后,我通过将此行添加到for循环中来确定第一个标记:

if( i==0 ){ first_marker = marker; }

这就是我如何知道在添加标记后在哪里使用panTo()地图,但是我不知道如何使用setContent()向这个标记添加infoBox,如果这是我需要解决的问题的话。有人能帮我在第一个标记上获得infoBox的内容集,然后打开infoBox作为地图的“打开状态”吗?

共有1个答案

贡英华
2023-03-14

可能的选择

infoWindow.open()之前设置内容

infoWindow.setContent(infoWindowContent[0][0]);
infoWindow.open(map,first_marker);

触发点击标记:

google.maps.event.trigger(first_marker,'click');

设置选项:

 infoWindow.setOptions({
  content:infoWindowContent[0][0],
  map:map,
  position:first_marker.getPosition()
});

 类似资料:
  • 我正在使用Selenium2.20WebDriver用C#创建和管理一个firefox浏览器。要访问页面,我使用以下代码,在访问URL之前设置驱动超时: 问题是,有时加载页面需要花费很长时间,使用selenium WebDriver加载页面的默认超时时间似乎是30秒,这太长了。并且我认为我设置的超时不适用于使用GoToUrl()方法加载页面。 所以我试图弄清楚如何设置页面加载的超时,然而,我找不到

  • 我试图在一个网站上获得一个内容列表(若有人感兴趣的话,这一个)。布局最近发生了变化,现在他们不会一次加载所有内容,而是使用magic(可能是js)。我目前正在使用JSoup分析HTML,但我愿意接受建议。 这就是我得到的: 实现此目的的代码: 这是我想看到的(复制从检查元素后,页面加载了所有的内容): 谷歌帮不了什么忙,因为与微调器等相关的所有内容都与javascript有关。 解决方案: 由于J

  • 当你使用webpack时,有什么方法可以阻止加载所有的语言环境(我只需要英语)?我在看源代码,似乎如果定义了,它是为webpack定义的,那么它总是试图每个区域设置。我很确定这需要一个拉请求来修复。但有什么办法,我们可以修复这个与webpack配置? 这是我加载momentjs的网页配置: 然后,无论我在哪里需要它,我都只需要。这是可行的,但它会将大约250 kB不需要的语言文件添加到我的包中。我

  • 本文向大家介绍如何使用jQuery设置元素的HTML内容?,包括了如何使用jQuery设置元素的HTML内容?的使用技巧和注意事项,需要的朋友参考一下 要设置元素的HTML内容,请使用方法。您可以尝试运行以下代码以使用jQuery获取元素的HTML内容- 示例 现场演示

  • 我的大摇大摆的ui显示“参数内容类型”,其中包含各种条目:、、和。 我只想要。 在repo上有一个类似的未解决的问题,它使用了这个可视化(旧的ui,但相同的想法): 版本 版本

  • 问题内容: 我正在尝试将MutationObserver设置为在加载时观察页面突变。 为此,应在页面加载之前配置MutationObserver。 使用selenium-chromedriver,找不到为此目的注入JS的方法。 我知道chrome扩展程序可以做到这一点,但扩展程序无法在无头模式下工作。 那就是问题所在。 问题答案: 通过调用DevTool API可以实现