2017-12-23 38 views
0

私はGoogleマップのマーカーに情報ウィンドウのコンテンツを追加しようとしています。私はサーバーに照会し、データを取得し、地図上にマーカーを置くことができます。それは動作します。うまくいかないのは、マーカーをクリックしても何も起こらないということです。私は情報ウィンドウがポップアップすると思います。残念ながら、私はGoogleマップのプログラミングを行って以来、それはずっとずっと続いています。何らかの理由で、マーカーのクリックイベントが呼び出されていません。私の愚かさに関するどんな提案も高く評価されます。 Googleマップにinfowindowを追加


<script> 
    var map, geocoder; 
    var Markers = []; 
    function initMap() { 
     map = new google.maps.Map(document.getElementById('map'), { 
      center: { lat: 0.0, lng: 0.0 }, 
      zoom: 12 
     }); 
     if (!Modernizr.geolocation) { 
      alert("Your browser sucks. Get a new one, maybe one that is up to date and supports GPS.") 
      return; 
     } 
     else { 
      navigator.geolocation.getCurrentPosition(show_map); 
     } 
    } 
    function show_map(position) { 
     map.setZoom(12); 
     var Latitude = position.coords.latitude; 
     var Longitude = position.coords.longitude; 
     map.setCenter({ lat: Latitude, lng: Longitude }); 
     var bounds = map.getBounds(); 
     var url = "/api/xxxxxxxxjsonendpoint"; 
     var lowerLeft = bounds.getSouthWest(); 
     var upperRight = bounds.getNorthEast(); 
     var lat0 = lowerLeft.lat(); 
     var lng0 = lowerLeft.lng(); 
     var lat1 = upperRight.lat(); 
     var lng1 = upperRight.lng(); 
     var geocoder = new google.maps.Geocoder(); 
     var data = { LowerLeftLat: lat0, LowerLeftLng: lng0, UpperRightLat: lat1, UpperRightLng: lng1 }; 
     $.get(url, data, function (result) { 
      for (var i = 0; i < result.length; i++) { 
       var address = result[i].Address1 + " " + (result[i].Address2 != null ? result[i].Address2 : "") + " " + result[i].City + " " + result[i].Province + " " + result[i].PostalCode + " " + result[i].Country; 
       var marker = new google.maps.Marker({ 
        position: geocodeAddress(geocoder, map, address), 
        map: map, 
        title: address 
       }); 
       var infowindow = new google.maps.InfoWindow({ 
        content: i 
       }); 
       makeInfoWindowEvent(map, infowindow, "test" + i, marker); 
      } 
     }); 
    } 
    function geocodeAddress(geocoder, resultsMap, address) { 
     geocoder.geocode({ 'address': address }, function (results, status) { 
      if (status === 'OK') { 
       resultsMap.setCenter(results[0].geometry.location); 
       var marker = new google.maps.Marker({ 
        map: resultsMap, 
        position: results[0].geometry.location 
       }); 
      } else { 
       alert('Geocode was not successful for the following reason: ' + status); 
      } 
     }); 
    } 
    function makeInfoWindowEvent(map, infowindow, contentString, marker) { 
     google.maps.event.addListener(marker, 'click', function() { 
      infowindow.setContent(contentString); 
      infowindow.open(map, marker); 
     }); 
    } 
</script> 
TIA

は、ここに私のコードの最新のアップデートです。リスナーが呼び出しているときので、まだworkyない........

<script> 
    var map, geocoder; 
    var Markers = []; 
    var infowindow; 
    function initMap() { 
     map = new google.maps.Map(document.getElementById('map'), { 
      center: { lat: 0.0, lng: 0.0 }, 
      zoom: 12 
     }); 
     infowindow = new google.maps.InfoWindow(); 
     if (!Modernizr.geolocation) { 
      alert("Your browser sucks. Get a new one, maybe one that is up to date and supports GPS.") 
      return; 
     } 
     else { 
      navigator.geolocation.getCurrentPosition(show_map); 
     } 
    } 
    function show_map(position) { 
     map.setZoom(12); 
     var Latitude = position.coords.latitude; 
     var Longitude = position.coords.longitude; 
     map.setCenter({ lat: Latitude, lng: Longitude }); 
     var bounds = map.getBounds(); 
     var url = "/api/xxxxxxx/yyyyyyyyyy"; 
     var lowerLeft = bounds.getSouthWest(); 
     var upperRight = bounds.getNorthEast(); 
     var lat0 = lowerLeft.lat(); 
     var lng0 = lowerLeft.lng(); 
     var lat1 = upperRight.lat(); 
     var lng1 = upperRight.lng(); 
     var geocoder = new google.maps.Geocoder(); 
     var data = { LowerLeftLat: lat0, LowerLeftLng: lng0, UpperRightLat: lat1, UpperRightLng: lng1 }; 
     $.get(url, data, function (result) { 
      for (var i = 0; i < result.length; i++) { 
       var address = result[i].Address1 + " " + 
        (result[i].Address2 != null ? result[i].Address2 : "") + 
        " " + result[i].City + " " + result[i].Province + " " + 
        result[i].PostalCode + " " + result[i].Country; 
       var marker = new google.maps.Marker({ 
        position: geocodeAddress(geocoder, map, address), 
        map: map, 
        title: address, 
        content: address 
       }); 

       makeInfoWindowEvent(infowindow, "test" + i, marker); 
      } 
     }); 
    } 
    function geocodeAddress(geocoder, resultsMap, address) { 
     geocoder.geocode({ 'address': address }, function (results, status) { 
      if (status === 'OK') { 
       resultsMap.setCenter(results[0].geometry.location); 
       var marker = new google.maps.Marker({ 
        map: resultsMap, 
        position: results[0].geometry.location 
       }); 
      } else { 
       alert('Geocode was not successful for the following reason: ' + status); 
      } 
     }); 
    } 
    function makeInfoWindowEvent(infowindow, contentString, marker) { 
     (function (zinfowindow, zcontentString, zmarker) { 
      zinfowindow.setContent(zcontentString); 
      google.maps.event.addListener(zmarker, 'click', function() { 
       zinfowindow.open(map, zmarker); 
      }); 
     })(infowindow, contentString, marker); 
    } 
</script> 
+0

'geocodeAddress(geocoder、map、address)' 'geocodeAddress'関数は何も返しません(非同期なのでできません)。 – geocodezip

答えて

0
function makeInfoWindowEvent(map, infowindow, contentString, marker) { 
    infowindow.setContent(contentString); 
    google.maps.event.addListener(marker, 'click', function() { 
     infowindow.open(map, marker); 
    }); 
} 
0

あなたのコードのクラッシュ、とinfowindowの値がすでに変更されています。あなたは(ちょうどmakeInfoWindowEvent機能を変更)このような何かを試すことができます。

function makeInfoWindowEvent(map, infowindow, contentString, marker) { 
    google.maps.event.addListener(marker, 'click', function() { 
     infowindow.setContent(contentString); 
     infowindow.open(map, marker); 
     console.log (contentString); 
     console.log (marker); 
    }); 
} 

通常は、出力は常にcontentStringと同じになります。

contentStringinfowindowの実際の値を渡すには、IIFEを作成する必要があります。このように、変数の値は、関数の内部でコピーされます。マップの値は常に同じであるため

function makeInfoWindowEvent(map, infowindow, contentString, marker) { 
    (function (zinfowindow, zcontentString, zmarker) { 
     zinfowindow.setContent(zcontentString); 
     google.maps.event.addListener(zmarker, 'click', function() { 
     zinfowindow.open(map, zmarker); 
     }); 
    })(infowindow, contentString, marker); 
} 

ただし、パラメータとしてマップを渡す必要はありません。

質問がありましたら教えてください。

+0

あなたのコードをありがとう。残念ながら、それは動作していません。 –

+0

エラーが表示されますか? –

+0

ここに私が使用しているコードがあります。私は現れているエラーを見ていない。私は、現在私が試みているコードで質問の中で自分のコードを更新しました。 PS。私は両親の健康問題に取り組んでいるので、質問/コメントに返答するまでにはしばらく時間がかかるかもしれません。 TIA –

関連する問題