質問: google mapで複数マーカーの情報ウィンドウ google mapで複数(多数)のマーカーの情報ウィンドウを切り替えたいです。 2個の場合はうまくいきました。 http://weed777.sakura.ne.jp/wordpress/?p=107 原理としては同じコードなのですが、7個に増やすとうまくいきません。 http://weed777.sakura.ne.jp/wordpress/?p=122 どうぞよろしくお願いします。
回答: 2個と7個の場合のコードの違いは、ループで処理しているのとそうでないのの違いですね。 (2個の場合はダイレクトにinfo[1]などだけれど、7個ではインデックスが変数) イベント処理の関数内にループのインデックスが含まれていますが、バインドされる時には関数内の変数は評価されず、実行時に値が評価されます。 (バインドのループ内では「i」は順にインクリメントされていますが、実行時には「i」の値は不定です。(大抵は8) 試しに、バインドする関数を google.maps.event.addlistener(marker[i], 'click', function(){ alert(i); }); のようにしてみればわかると思います。(どのマーカーをクリックしても「8」が表示される) それなので、変数iの値を固定して関数に引き渡しておく必要があります。 わかりやすく、別の関数を定義して google.maps.event.addlistener(marker[i], 'click', showinfo(i) ); function showinfo(index){ return function(){ var i=0; while(info[i]) info[i++].close(); info[index].open(map,marker[index]); } } のようにすれば、意図通り動作するかと思います。 *関数showinfoはループの外でinitialize内に定義してください。 (initialize外だと、今度はinfo[]、marker[]の参照ができなくなります。) ↑原因はこれと同様に、関数のスコープと変数の値の評価のタイミングにあるので、そのあたりを調べてみるとわかるかと思います。 匿名関数で記述することも可能ですので、試してみてください。