2013-10-10 4 views
0

В последнее время я играю с API Карт Google, и у меня есть ссылки, которые выполняют функцию JS. Эта функция JS частично работает, при щелчке она центрирует карту на штыревые координаты, но я также хочу, чтобы она отображала infowindow; Все работает, кроме открытия инфоиндуста. Любая помощь будет потрясающей! код немного загроможден функциями PHP/WP.API Карт Google V3 - Элемент onClick - Карта центра/Open InfoWindow

<script type="text/javascript"> 

    var map; 
    var infowindow; 
    var marker; 

    function initialize() { 
     var styles = [ 
      { 
       stylers: [ 
        { hue: "#c09c3d" }, 
       ] 
      },{ 
       featureType: "road", 
       elementType: "geometry", 
       stylers: [ 
        { lightness: 50 }, 
        { visibility: "simplified" } 
       ] 
      } 
     ]; 

     infowindow = new google.maps.InfoWindow({ 
      maxWidth: 275 
     }); 

     var mapOptions = { 
      zoom: 4, 
      center: new google.maps.LatLng(<?php echo $centerCoords; ?>), 
      styles: styles, 
      mapTypeId: google.maps.MapTypeId.ROADMAP 
      }; 

     map = new google.maps.Map(document.getElementById('googleMap'), mapOptions); 

     var image = '<?php echo get_template_directory_uri(); ?>/images/icon_marker.png'; 

     var locations = [ 
      <?php 
       // LOOP ARGUMENTS 
       $args = array('post_type' => 'cbd_dealers', 'posts_per_page' => -1, 'orderby' => 'menu_order', 'order' => 'ASC'); // -1 Shows ALL Posts 
       $loop = new WP_Query($args); 
       while ($loop->have_posts()) : $loop->the_post(); 

       // CUSTOM CONTENT 
       $dealerStreetAddress = get_post_meta($post->ID,"dealerStreetAddress",true); 
       $dealerCity = get_post_meta($post->ID,"dealerCity",true); 
       $dealerState = get_post_meta($post->ID,"dealerState",true); 
       $dealerZipCode = get_post_meta($post->ID,"dealerZipCode",true); 
       $dealerCoords = get_post_meta($post->ID,"dealerCoords",true); 
       $dealerPhoneNumber = get_post_meta($post->ID,"dealerPhoneNumber",true); 
       $dealerLink = get_post_meta($post->ID,"dealerLink",true); 
      ?> 

      { 
       latlng : new google.maps.LatLng<?php echo $dealerCoords; ?>, 

       info: '<style>a{color:#000000 !important;}a:hover{color:#DCB54F !important;}</style><strong style="line-height:25px;display:block;width:230px;"><?php the_title(); ?></strong><?php echo $dealerStreetAddress; ?><br /><?php echo $dealerCity; ?>, <?php echo $dealerState; ?>&nbsp;<?php echo $dealerZipCode; ?><br /><?php echo $dealerPhoneNumber; ?><br /><a href="<?php echo $dealerLink; ?>" style="line-height:25px;display:block;width:230px;" target="_blank">View Website</a>' 
      }, 

      <?php /* END WHILE AND RESET QUERY */ endwhile; wp_reset_query(); ?> 

       ]; 

      for (var i = 0; i < locations.length; i++) { 
       marker = new google.maps.Marker({ 
        position: locations[i].latlng, 
        icon: image, 
        map: map 
       }); 

       google.maps.event.addListener(marker, 'click', (function(marker, i) { 
        return function() { 

        infowindow.setContent(locations[i].info); 
        infowindow.open(map, marker); 
        } 
       })(marker, i)); 
      } 

    } 
    function loadScript() { 
     var script = document.createElement('script'); 
     script.type = 'text/javascript'; 
     script.src = 'https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&' + 'callback=initialize'; 
     document.body.appendChild(script); 
     } 
    function set_map_center(lat, lng) { 

       var myLatLng = new google.maps.LatLng(lat, lng); 
       infowindow.open(map,marker); 

       map.setCenter(myLatLng); 
       map.setZoom(12); 
       infowindow.open(map, marker); 
     } 

    window.onload = loadScript; 
</script> 
+0

Вы хотите все InfoWindow открыты на всех маркерах или только на конкретном? Что-то вроде [этого] (http://www.geocodezip.com/v3_MW_example_linktomarker.html?marker=1)? – geocodezip

+0

Я вижу, что вы объявляете функцию set_map_center (lat, lng), но вы никогда не используете ее. Вы можете просто вызвать map.setCenter (marker.position); внутри функции, где вы добавляете прослушиватель 'click' к маркеру? – Bryan

+0

Вам нужно привязать клик по ссылке, нажав на маркер. Таким образом, в вашем событии 'onClick' ссылки вызывается щелчок« маркера », который соответствует. Таким образом, прослушиватель кликов на «маркере» будет обрабатывать открытие «infowindow». (Надеюсь, что это имеет смысл?) –

ответ

2

Благодаря комментарий Суви, я лучше понимаю.

Прежде всего, вам нужно будет сохранить все свои маркеры в массиве при их создании. Затем в вашей функции set_map_center вы можете сканировать маркеры, чтобы найти соответствующий Lat/Lng, а затем запустить событие щелчка маркера.

Чтобы вызвать событие маркеров, нажмите:

google.maps.event.trigger(markers[i], 'click'); 

Вот как я могу проверить на матч LAT/LNG

function set_map_center(lat, lng){ 
    var pos = new google.maps.LatLng(lat, lng) 
    for(var i=0;i<markers.length;i++){ 
     if(markers[i].position.equals(pos)) 
      google.maps.event.trigger(markers[i], 'click'); 

    } 
} 

JSFiddle Example

+0

Эй, это почти все, но вы можете столкнуться с случаями, когда lat/lng одинаковы. @geocodezip действительно отлично справляется с этим в своей демонстрации, динамически создавая ссылки, создавая маркеры в функции 'createMarker'. У него также есть маркеры в глобальном массиве, и каждый раз, когда создается ссылка и маркер, ссылка получает идентификатор массива, чтобы перейти к функции щелчка, - который вызывает щелчок на правильном маркере в массиве. –

+0

Я не лучший, когда дело доходит до javascript. Как я могу создать массив? Я немного поиграл с ним и не могу заставить его функционировать –

+0

Чтобы создать массив: 'markerArray = []'. Чтобы добавить элементы в массив динамически: 'markerArray.push (item)'. Надеюсь, это поможет? –

Смежные вопросы