teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

ついきです。

2019/10/30 05:36

投稿

mix-peach
mix-peach

スコア1910

answer CHANGED
@@ -40,4 +40,61 @@
40
40
 
41
41
  期待する動作になりませんので、このコードのみでインフォウィンドウが消えるわけではないことが分かるはず。。。
42
42
 
43
- 以上、ご参考までに・・!
43
+ 以上、ご参考までに・・!
44
+
45
+
46
+ ---
47
+
48
+ 追記です。
49
+
50
+ >close()メソッドが表示を前提にしているという仕様
51
+
52
+ こちらは断言できる程js内部は確認してないので、「・・のようです」と書きました・・。
53
+ が一応、close()メソッド自体は、表示有無にかかわらず実行出来てエラーにならないことと、実際には表示されているときしか閉じられないことの2点からそのように判断をした感じです。
54
+
55
+ 今回の場合は、動作確認用に書いたコードが「うまくいっちゃった」のが、原因解明できなくなってしまった主な原因ですよね。
56
+ 自らの罠にはまることは、たぶんベテランさんでもたまに起きちゃうので仕方ないと思います。
57
+ ただそこから打開策まで辿り着くための、経験値等が足りないだけ・・かなぁと。
58
+
59
+ 本当は、「やりたいけど、できないことだけをミニマム」で実行して、動作確認してみたらよかっただけなのです。(これ、teratailで回答者さん側の助言でよく見かけると思います)
60
+
61
+ 今回の話で言うなら、
62
+ ```javascript
63
+ //マーカーを消すところを一旦コメントアウトする
64
+ // marker[markerKeys[i]][j].setMap(null);//マーカーを消す
65
+ infoWindow[markerKeys[i]][j].close();//インフォウィンドウを閉じる
66
+ ```
67
+
68
+ こうするだけで、「ループでclose()で閉じることができない」と思っていた
69
+ ```
70
+ infoWindow[markerKeys[i]][j].close();//インフォウィンドウを閉じる
71
+ ```
72
+ ここには、実際には問題がないことに気づけます。
73
+ 気づけさえすれば、
74
+
75
+ 上手く行かない時と何がちがうのか
76
+
77
+ 「マーカーを先に消している」ことだけ違う
78
+
79
+ じゃあ「マーカーを先に消している」ことが、上手く行かない原因なのだろうから、後で消してみてはどうだろう・・
80
+
81
+ と打開策に辿り着けたハズ・・・です!多分! ^^
82
+
83
+ ---
84
+
85
+ 常に一つだけ表示したいのであれば、複数をオブジェクトにして保持して置かなくても良いのでは?と思いますが、
86
+ 現状維持かつ、ループが面倒というのであれば、
87
+
88
+ ```javascript
89
+ function markerEvent(i,j){
90
+ if(nowInfoWindow){ nowInfoWindow.close(); }
91
+ nowInfoWindow = infoWindow[mObjKeys[i]][j];
92
+ marker[mObjKeys[i]][j].addListener('click', function() { // マーカーをクリックしたとき
93
+ nowInfoWindow.open(map,marker[mObjKeys[i]][j]); // 吹き出しの表示
94
+ });
95
+ }
96
+ ```
97
+ とするだけでも良さそうかなと思います(nowInfoWindowは先頭で宣言を追加してくださいね)。
98
+
99
+ が、新しい変数を使いたくなければ、おとなしくループするしかないかも・・・
100
+ ただし、ループの場合、オブジェクトの中身が多くなればなっただけ処理が重たくなっていく可能性が高いですので、その点ご注意を。。。