Google Mapで複数(多数)のマーカーの情報ウィンドウを切り替えたいです。
2個の場合はうまくいきました。
http://weed777.sakura.ne.jp/wordpress/?p=107
原理としては同じコードなのですが、7個に増やすとうまくいきません。
http://weed777.sakura.ne.jp/wordpress/?p=122
どうぞよろしくお願いします。
No.3ベストアンサー
- 回答日時:
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[]の参照ができなくなります。)
↑原因はこれと同様に、関数のスコープと変数の値の評価のタイミングにあるので、そのあたりを調べてみるとわかるかと思います。
匿名関数で記述することも可能ですので、試してみてください。
原因から丁寧に教えて頂いて、
本当にありがとうございました。
とても勉強になりました。
http://weed777.sakura.ne.jp/wordpress/?p=141
No.2
- 回答日時:
Firebugでチェックしてみたら、
info[i]が未定義ってエラーが出たよ。
教えて頂いて、ありがとうございます。
「イベント処理の関数内にループのインデックスが含まれていますが、バインドされる時には関数内の変数は評価されず、実行時に値が評価されます。」というのが真相でした。
でもfirebugを使うとこんなことも分かるんですね。
勉強になりました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 地図・道路 関西エリアの高速道路について教えてください 1 2022/04/05 13:13
- WordPress(ワードプレス) httpからhttpsへのリダイレクト設定について 2 2022/04/17 09:49
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- その他(プログラミング・Web制作) .htaccessファイルの修正がこれで問題ないかどうか 1 2022/04/21 08:42
- YouTube YouTubeのチャンネル。1個つくるのに、Googleアカウントは一個ずつ必要か? 9 2022/05/15 08:11
- 格安スマホ・SIMフリースマホ 6インチ以上のおすすめスマホを教えてください 4 2022/11/25 20:37
- Google Maps オフラインでもGPS使えるとネットに書いてありましたが、 圏外の状態で、Google Mapで位置情 3 2022/04/20 17:52
- Gmail Googleの連絡先を共有する方法があればアドバイス願います。 3 2023/03/30 11:11
- その他(スマホアプリ・スマホゲーム) Googleアカウントが複数になり、携帯電話番号が紐ついたものを解約してしまいました。もう1年経過し 1 2023/04/29 14:14
- Bluetooth・テザリング android(Galaxy S-22)、bluetoothの「この端末名」がコロコロ変わる 1 2022/12/17 13:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで3秒だけ時間を止めたい
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
Excel vba でコンボボックスの...
-
Application->Run();の機能につ...
-
VBA for i=1 to lastrow
-
CSVファイルの特定の行だけを読...
-
ダイアログのテキストにマウス...
-
エクセルの当番表を作っていま...
-
C言語でファクト関数を使わずに...
-
xmplayの使い方
-
素数であるかどうかを判定する...
-
XMLファイルをDataSetに読込む...
-
VBA Boxが空白の場合のメッセー...
-
アクティブセルから、A列最終行...
-
JQueryのスライドショーを停止...
-
アルゴリズムでのループの終了...
-
vbscriptでIE自動入力(途中で...
-
再帰関数のインライン展開
-
ガレージバンド のサンプリング...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
ループ7回目の悪役令嬢は、元敵...
-
UWSCの終了の仕方
-
Escキーを押すと、中断する時と...
-
エクセルの当番表を作っていま...
-
GIFアニメをループさせたくない
-
VBAで3秒だけ時間を止めたい
-
どなたかこのプログラミングを...
-
VBA for i=1 to lastrow
-
DOSコマンドのループ内のTIMEコ...
-
ListBox 複数選択 で オートフ...
-
vbscriptでIE自動入力(途中で...
-
vb.netからエクセル関数書き込み
-
DoEventsが必要な理由について
-
Java 南京錠
-
アクティブセルから、A列最終行...
-
テキストボックスの名前に変数...
-
範囲指定したセルを1つずつ飛...
-
VBA Dir関数でファイルをループ...
おすすめ情報