2012-03-08 20 views
0

Googleマップ(api v3)を検索結果に応じてマーカーの数で作成しました。マーカーをクリックすると、情報ウィンドウが開きます。その情報ウィンドウにそのマーカーに関連する情報を表示させる最良の方法は何ですか?すべてのマーカーに関連する情報は、私がajaxリクエストから受け取るjsonオブジェクト内にあります。マーカー固有の情報ウィンドウにコンテンツを表示する方法は?

for (i=0; i < result.point.length; i++) { 
        var latLng = new google.maps.LatLng(result.proint[i].Latitude,result.point[i].Longitude);          
        var marker = new google.maps.Marker({ 
         position: latLng, 
         title: i.toString() 
         //map: map 
        }); 
        markersArray.push(marker); 

        var infowindow = new google.maps.InfoWindow({ 
         content: 'specific information associated to the marker clicked' 
        }); 

        google.maps.event.addListener(markersArray[i], 'click', function(event) { 
         infowindow.open(map, this); 
        }); 
+0

リンクすでにそれをテストした作品貴重なものになるでしょう。 – andresf

+0

複数の情報ウィンドウが必要ですか、1つだけですか?コードが今のように、新しい情報ウィンドウが各マーカーに対して作成されますが、最後に作成されたものは1つだけ表示されます。あなたの意図が1つしかない場合は、forループからその作成を外す必要があります。 – puckhead

+0

私はより多くのコードは、少なくともJSONオブジェクトに役立つと同意します。 – puckhead

答えて

-1

あなたは何をしようとしているのかよくわかりません。どこのコンテンツを読み込もうとしていますか?

google.maps.event.addListener(marker, 'click', (function(event, index) { 
    return function(){ 
    infowindow.content = markersArray[index].yourcontent; 
    // or 
    infowindow.content = yourcontentarray[index]; 
    infowindow.open(map,this); 
    } 
})(marker,i)); 

マーカーとインフォウィンドウ変数を関数外に宣言してください。

+1

このコードにはいくつかの欠陥があります。まず、** event **はIIFEの引数であり、返された関数の引数でなければなりません。ここでイベントは実際に渡されたマーカーと同じで、イベントではありません。マーカーを渡す必要はありません。次に、contentプロパティを直接設定する代わりに、infowindowのsetContentメソッドを使用する必要があります。プロパティを設定すると動作しますが、MVCObjectのKVOの利点をバイパスします。たとえば、setContentを使用するとinfowindowのcontent_changedイベントがトリガーされ、プロパティを直接設定することはできません。 – puckhead

0

あなたはループの先頭で、あなたの例では、いくつかのタイプミス(proint)を持っている:

for (i=0; i < result.point.length; i++) { 
    var info_window_content = result.point[i].Latitude + '<br />'; 
    info_window_content += result.point[i].Longitue + '<br />'; 
    // etc for any value in you json object 
    // create your marker as is. 
    ... 
    var infowindow = new google.maps.InfoWindow({ 
        content: info_window_content 
       }); 
    // etc, etc. 

あなたは、あなたがやっているように、各マーカーにイベントリスナーを追加する必要があります。私はそれに何の問題も見ません。 これ以外にinfoWindow.open(map、marker)を使用します。

もっと効率的な方法があります。つまりinfoWindow.open()の後です。 infoWindow.setContent(info_window_content)

+0

ありがとうエリック!私は最初に 'これ'を使用して、情報ウィンドウがマーカーに基づいて配置されるようにしました。私はあなたのソリューションを実装しましたが、コンテンツが静的なままであるので、何か間違ったことをしているかもしれませマーカーに関連付けられたコンテンツをロードする方法を探しています。 –

2

まず、infoWindowの作成をforループから外す必要があります。あなたはこれにクリックイベントを添付

次に、変更は:

google.maps.event.addListener(markersArray[i], 'click', function(content) { 
    return function(event){ 
     infowindow.setContent(content); 
     infowindow.open(map, this); 
    } 
}(WHATEVER_THE_CONTENT_SHOULD_BE_FOR_THIS_MARKER)); 

あなたはこのの代わりマーカーを使用します。 は、イベントが発生したオブジェクトを参照し、マーカーは、最後に作成されたマーカーを参照します。

+0

次のリンクは誰か他の人によって投稿されました。それは私が達成しようとしているものの完全な例です。 http://updates.orbitz.com/ –

+0

上記はあなたが望むものを得るはずです。更新されたコードを提供できない場合は、また、PHPではなくJavaScript形式のJSONのサンプルが役立ちます。 – puckhead

+0

それは最終的に動作します!シンタクスエラー...シェーン、おしゃべり、私はあなたの助けに非常に感謝します。 –

6

上記のようにinfoWindowを1つだけ作成してください。

マーカー内のコンテンツストア:

var marker = new google.maps.Marker({ 
         position: latLng, 
         title: i.toString(), 
         //set your content here 
         content:'your specific content' 
         //map: map 
        }); 

窓の開口部:

google.maps.event.addListener(markersArray[i], 'click', function(event) { 
         infoWindow.setContent(this.content); 
         infowindow.open(map, this); 
        }); 
0

はこれを試してみてください、それは私がコードを生きるために

// Add markers 

    for (i=0; i < result.point.length; i++) { 
        var latLng = new google.maps.LatLng(result.proint[i].Latitude, result.point[i].Longitude);          
        var marker = new google.maps.Marker({ 
         position: latLng, 
         title: i.toString() 
         //map: map 
        });      

    // marker info start 
        var infowindow = new google.maps.InfoWindow(); 

    (function (marker, result.point[i]) { 
        // add click event 
        google.maps.event.addListener(marker, 'click', function() { 
        var infoContent: "specific information associated to the marker clicked" 
        }); 
     infoWindow.setContent(infoContent); 
         infowindow.open(map, marker); 
        }); 

    // selected marker 4 infowindow 
    (marker, result.point[i]); 

     markersArray.push(marker); 
     } 
関連する問題