【问题标题】:InfoBox (getElementById) for each marker – Google Maps API 3每个标记的 InfoBox (getElementById) – Google Maps API 3
【发布时间】:2014-04-06 08:32:31
【问题描述】:

我正在使用带有 InfoBox 的 Google Maps API v3 来设置单击标记时出现的弹出窗口的样式。

这是我的信息框设置:

// New InfoWindow
infobox = new InfoBox({
    content: document.getElementById('marker-info'),
    disableAutoPan: false,
    pixelOffset: new google.maps.Size(-140, 0),
    zIndex: null,
    closeBoxMargin: '10px 9px 12px 0',
    closeBoxURL: siteURL + 'wp-content/themes/bmk-wp-build/img/close-google-popup.png',
    infoBoxClearance: new google.maps.Size(1, 1)
});

我有一个带有许多标记的谷歌地图,它是通过 Wordpress 使用 ACF 和 Locations 字段设置的。一切正常,但唯一的问题是InfoBox 为每个标记输出相同的内容。很明显,这与这一行有关:

content: document.getElementById('marker-info'),

这是我的 PHP/HTML:

<?php while ( $company_query->have_posts() ) : $company_query->the_post(); ?>
<?php $location = get_field('location'); if ( !empty($location) ) : ?>
    <div class="marker" data-lat="<?php echo $location['lat']; ?>" data-lng="<?php echo $location['lng']; ?>" id="<?php echo get_the_ID(); ?>">
        <div id="marker-info" class="marker-info <?php echo get_the_ID(); ?>">
            <?php echo wp_get_attachment_image(get_field('logo'), 'full'); ?>
        </div>
    </div>
<?php endif; ?>
<?php endwhile; ?>

显然,在 while 循环中设置 id 是一个坏主意,而且很愚蠢,所以我显然可以摆脱它,但我将如何改变:

content: document.getElementById('marker-info'),

获取每个标记的每个 InfoBox 的每个 .marker-info?

【问题讨论】:

  • 能贴出完整的JS代码吗?我认为关键部分是如何将点击事件处理程序附加到标记并打开信息框,但最好有完整的代码。

标签: javascript php wordpress google-maps google-maps-api-3


【解决方案1】:

我用这个解决了...

google.maps.event.addListener(marker, 'click', function() {
    console.log( $marker.children().html() );

    infobox.open(map,marker);
    infobox.setContent($marker.children().html());

});

【讨论】:

    【解决方案2】:

    为什么不在任何地方都使用同一个 InfoBox,并且最初声明它时不使用 content 选项?如果我理解正确,您可以为每个标记设置一个事件处理程序,并将回调设置为使用一个信息框。 类似于以下内容:

    var markers = document.getElementsByClassName('marker');
    for( var i = 0; i < markers.length; i++ ) {
        google.maps.event.addDomListener(markers[i], 'click', function() {
             infobox.setContent(this.children[0]);
             infobox.open(map);
        });
    }
    

    有了这个,您可能可以完全摆脱使用 ID。如果你想保留 ID,我建议你在类名中设置 ID,将其附加到 PHP 代码中的实际 ID。

    【讨论】:

    • 谢谢@LaughDonor。我已经添加了这个,但似乎在markers.length for statement上有所不足。我为标记添加了一个 console.log,它显示了所有标记,这很好:var theMarkers = document.getElementsByClassName('marker'); console.log(theMarkers); for ( var i = 0; i &lt; theMarkers.length; i++ ) { google.maps.event.addDomListener(theMarkers[i], 'click', function() { console.log('clicked'); infobox.setContent(this.children[0]); infobox.open(map); }); }
    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多