InfoBox (getElementById) para cada marcador – Google Maps API 3

3 minutos de lectura

avatar de usuario
Juan el pintor

Estoy usando Google Maps API v3, con InfoBox, para diseñar las ventanas emergentes que aparecen al hacer clic en un marcador.

Aquí está mi configuración de InfoBox:

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

Tengo un mapa de Google con muchos marcadores, que se está configurando con WordPress usando ACF y el campo Ubicaciones. Todo funciona muy bien, pero el único problema es el InfoBox está generando el mismo contenido para cada marcador. Esto tiene, claramente, que ver con esta línea:

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

Aquí está mi 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; ?>

Claramente, tener un id establecer en el bucle while es una mala idea y una estupidez, por lo que obviamente puedo deshacerme de eso, pero ¿cómo cambiaría?

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

obtener cada .marker-info para cada InfoBox para cada marcador?

  • ¿Puedes publicar tu código JS completo? Creo que la parte clave es cómo adjunta los controladores de eventos de clic a los marcadores y abre los cuadros de información, pero sería mejor tener el código completo.

    – Jeffery Para

    7 de marzo de 2014 a las 12:03

Lo solucioné con esto…

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

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

});

avatar de usuario
Patel soleado

¿Por qué no usar el mismo cuadro de información en todas partes y declararlo inicialmente sin la opción de contenido? Si entiendo bien, puede tener un controlador de eventos para cada marcador y configurar la devolución de llamada para usar el único cuadro de información. Algo como lo siguiente:

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

Con esto, probablemente puedas deshacerte del uso de la ID por completo. Si desea mantener la identificación, le sugiero que cambie la configuración de la identificación dentro del nombre de la clase, para agregarla a la identificación real dentro del código PHP.

  • Gracias @LaughDonor. Agregué esto, pero parece que me estoy quedando corto en los marcadores. Longitud para la declaración. Agregué un archivo console.log para marcadores y los muestra todos, lo cual es bueno: var theMarkers = document.getElementsByClassName('marker'); console.log(theMarkers); for ( var i = 0; i < theMarkers.length; i++ ) { google.maps.event.addDomListener(theMarkers[i], 'click', function() { console.log('clicked'); infobox.setContent(this.children[0]); infobox.open(map); }); }

    – Juan el pintor

    7 de marzo de 2014 a las 9:04


¿Ha sido útil esta solución?