[英]Google Map API loading dynamic info windows
我有谷歌地圖在我的數據庫中動態地在地圖上加載位置。 問題是它沒有顯示每個位置正確的顯示信息。 它僅顯示所有標記上最后一個產品的信息。 我需要以某種方式迭代每個標記。 我的代碼如下:
<section class="content jumbotron jumbotron-full-height">
<div class="item slide-1">
<div id="home-map"></div>
</div>
</section>
<script>
var map;
function initMap() {
map = new google.maps.Map(document.getElementById('home-map'), {
center: {lat: 52.1326, lng: 5.2913},
zoom: 6,
mapTypeId: 'roadmap',
styles: [
{
featureType: 'all',
stylers: [
{ saturation: 0 }
]
},{
featureType: 'road.arterial',
elementType: 'geometry',
stylers: [
{ hue: '#00ffee' },
{ saturation: 0 }
]
},{
featureType: 'poi.business',
elementType: 'labels',
stylers: [
{ visibility: 'off' }
]
},{
featureType: 'road',
elementType: 'labels',
stylers: [
{ visibility: 'on' }
]
}
]
});
{% for product in products %}
var contentString = '<div class="info-window">'+
'<div id="siteNotice">'+
'</div>'+
'<div id="window-content">'+
'{% set path = product.image is not null ? product.image.path|imagine_filter(filter|default('sylius_shop_map_thumbnail')) : 'http://placehold.it/200x200' %}'+
'<img src="{{ path }}" />'+
'<h1>{{ product.code }}</h1>'+
'</div>'+
'<h2>{{ product.city }} - {{ product.country }}</h2>'+
'<p><strong> Description: </strong>{{ product.shortDescription }}</p>'+
'<p><strong> Price: </strong>from {{ product.price|sylius_price }} a day.</p>'+
'<a class="btn btn-primary" href="{{ path("sylius_shop_product_show", {"slug": product.slug}) }}">more info</a>'+
'</div>';
var infowindow = new google.maps.InfoWindow({
content: contentString,
maxWidth: 600
});
var marker = new google.maps.Marker({
position: {lat: {{ product.latitude }}, lng: {{ product.longitude }}},
map: map,
title: '{{ product.city }}',
label: '{{ product.address }}'
});
marker.addListener('click', function() {
infowindow.open(map, marker);
});
{% endfor %}
}
</script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyC1c34AXAQ5Y3yV43Alj_ieMRaDPb0qZ44&callback=initMap" async defer>
</script>
問題是您沒有動態設置其內容。 為此,您必須從另一個函數創建標記
<section class="content jumbotron jumbotron-full-height">
<div class="item slide-1">
<div id="home-map"></div>
</div>
</section>
<script>
var map,infowindow;
function initMap() {
map = new google.maps.Map(document.getElementById('home-map'), {
center: {lat: 52.1326, lng: 5.2913},
zoom: 6,
mapTypeId: 'roadmap',
styles: [
{
featureType: 'all',
stylers: [
{ saturation: 0 }
]
},{
featureType: 'road.arterial',
elementType: 'geometry',
stylers: [
{ hue: '#00ffee' },
{ saturation: 0 }
]
},{
featureType: 'poi.business',
elementType: 'labels',
stylers: [
{ visibility: 'off' }
]
},{
featureType: 'road',
elementType: 'labels',
stylers: [
{ visibility: 'on' }
]
}
]
});
infowindow = new google.maps.InfoWindow({
maxWidth: 600
});
{% for product in products %}
createMarker(product )
{% endfor %}
}
function createMarker(product){
var contentString = '<div class="info-window">'+
'<div id="siteNotice">'+
'</div>'+
'<div id="window-content">'+
'{% set path = product.image is not null ? product.image.path|imagine_filter(filter|default('sylius_shop_map_thumbnail')) : 'http://placehold.it/200x200' %}'+
'<img src="{{ path }}" />'+
'<h1>{{ product.code }}</h1>'+
'</div>'+
'<h2>{{ product.city }} - {{ product.country }}</h2>'+
'<p><strong> Description: </strong>{{ product.shortDescription }}</p>'+
'<p><strong> Price: </strong>from {{ product.price|sylius_price }} a day.</p>'+
'<a class="btn btn-primary" href="{{ path("sylius_shop_product_show", {"slug": product.slug}) }}">more info</a>'+
'</div>';
var marker = new google.maps.Marker({
position: {lat: {{ product.latitude }}, lng: {{ product.longitude }}},
map: map,
title: '{{ product.city }}',
label: '{{ product.address }}'
});
marker.addListener('click', function() {
infowindow.setContent(contentString);
infowindow.open(map, marker);
});
}
</script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyC1c34AXAQ5Y3yV43Alj_ieMRaDPb0qZ44&callback=initMap" async defer>
</script>
一定要將infowindow聲明為全局變量
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.