Google Mapで以下のように、すべてのinfoWindowを非表示させようとオブジェクトをループさせてすべての要素にclose()を適用しようとしたところ動作をいたしませんでした。
原因を探るべく具体的に試しに一つ
infoWindow["k2"][0].close();//これは消える
を実行したところ["k2"][0]の要素は非表示になることがわかりました。
ただし、
infoWindow[markerKeys[i]][j].close();//これは消えない
で["k2"][0]のループに入っても消えてくれません。もちろん他のinfoWindowもすべて消えてくれません。
オブジェクトの中身に相違があるのかと以下の検証を実行しました。
console.log(infoWindow["k2"][0]==infoWindow[markerKeys[i]][j]);
すると["k2"][0]のループで正しくtrueが返されることが確認できました。
この状況から、["k2"][0]に限らず、ループ処理の場合だけclose()が動作しない理由がわからないのですが、同じような現象を経験したことがある方や、原因がわかる方がいらっしゃればお力添えをお願いできますでしょうか。
何卒、よろしくお願い申し上げます。
javascript
1/* 2var windows={ 3c1:{0._sf{省略}} 4k1:{0._sf{省略}} 5k2:{0._sf{省略},1._sf{省略}} 6} 7*/ 8 9$(function(){ 10 $('.ckClose').on('click',function(){ 11 var windowKeys=Object.keys(windows); 12 var windowLen=windowKeys.length; 13 for (var i = 0; i < windowLen; i++) { 14 for (var j = 0, innerLen=Object.keys(windows[windowKeys[i]]).length; j <innerLen ; j++) { 15 console.log(infoWindow["k2"][0]==infoWindow[windowKeys[i]][j]);//ここで違いを検証 16 infoWindow["k2"][0].close();//これは消える 17 infoWindow[windowKeys[i]][j].close();//これは消えない 18 } 19 } 20 }) 21})
以下の通り、具体的なコードを開示させていただきます。
$('.ckClose').on('click',function()の箇所が上記の具体的な質問の箇所です。私のGoogle Chrome(バージョン: 77.0.3865.120(Official Build) (64 ビット))のDeveloper Tool上では特段のエラーは出力されていません。
html
1<div id="map" class="web_map"></div> 2 3<div class="btnWrapper"> 4 <div id="" class="btn displayIcon ckOpen">X</div 5 <div id="" class="btn displayIcon ckClose">X</div> 6</div>
Javascript
1var map; 2var mObj ={}; 3var marker = {}; 4var infoWindow = {}; 5 6 7 mObj.k1= 8 [ 9 { 10 lat:35.639014, 11 lng:139.638741, 12 icon:"./z_icon/1_k.png" 13 } 14 ]; 15 16 mObj.c1= 17 [ 18 { 19 lat:35.631350, 20 lng:139.646900, 21 icon:"./z_icon/1_c.png" 22 } 23 ]; 24 25 mObj.k2= 26 [ 27 { 28 lat:35.562416, 29 lng:139.614346, 30 icon:"./z_icon/2_k.png" 31 }, 32 { 33 lat:35.757992, 34 lng:139.827880, 35 icon:"./z_icon/2_k.png" 36 } 37 ]; 38 39 mObj.c3= 40 [ 41 { 42 lat:35.591418, 43 lng:139.546924, 44 icon:"./z_icon/3_c.png" 45 } 46 ]; 47 48// console.log(mObj); 49 50function initialize() { 51 var latlng = new google.maps.LatLng(35.680552, 139.766923); 52 var opts = { 53 zoom: 11, 54 center: latlng, 55 mapTypeId: google.maps.MapTypeId.ROADMAP 56 }; 57 map = new google.maps.Map(document.getElementById("map"), opts); 58 59var mObjKeys=Object.keys(mObj); 60var keyLen=mObjKeys.length; 61 62 for (var i = 0; i < keyLen; i++) { 63 for (var j = 0; j < mObj[mObjKeys[i]].length; j++) { 64 if(j==0){ 65 marker[mObjKeys[i]]={[j]:new google.maps.Marker({ 66 position: new google.maps.LatLng({lat:mObj[mObjKeys[i]][j]['lat'],lng:mObj[mObjKeys[i]][j]['lng']}), 67 map: map, 68 icon:new google.maps.MarkerImage(mObj[mObjKeys[i]][j]['icon'],null,null,null,new google.maps.Size(41, 41)) 69 }) 70 } 71 infoWindow[mObjKeys[i]]={[j]: new google.maps.InfoWindow({ // 吹き出しの追加 72 content:mObj[mObjKeys[i]][j]['contents'] 73 }) 74 } 75 76 } else if(j>0){ 77 marker[mObjKeys[i]][j]=new google.maps.Marker({ 78 position: new google.maps.LatLng({lat:mObj[mObjKeys[i]][j]['lat'],lng:mObj[mObjKeys[i]][j]['lng']}), 79 map: map, 80 icon:new google.maps.MarkerImage(mObj[mObjKeys[i]][j]['icon'],null,null,null,new google.maps.Size(41, 41)) 81 }); 82 infoWindow[mObjKeys[i]][j]= new google.maps.InfoWindow({ // 吹き出しの追加 83 content:mObj[mObjKeys[i]][j]['contents'] 84 }); 85 } 86 markerEvent(i,j) 87 function markerEvent(i,j){ 88 marker[mObjKeys[i]][j].addListener('click', function() { // マーカーをクリックしたとき 89 infoWindow[mObjKeys[i]][j].open(map,marker[mObjKeys[i]][j]); // 吹き出しの表示 90 }); 91 } 92 } 93 } 94} 95 96console.log(infoWindow); 97/* 98{ 99 c1:{0:_.Sf} 100 c3:{0:_.Sf} 101 k1:{0:_.Sf} 102 k2:{0:_.Sf,1:_.Sf} 103} 104*/ 105/*ckCloseボタンによりすべてのMarkerを削除する*/ 106$(function(){ 107 $('.ckClose').on('click',function(){ 108 var markerKeys=Object.keys(marker); 109 var markerLen=markerKeys.length; 110 for (var i = 0; i < markerLen; i++) { 111 for (var j = 0, innerLen=Object.keys(marker[markerKeys[i]]).length; j <innerLen ; j++) { 112 marker[markerKeys[i]][j].setMap(null); 113 infoWindow[markerKeys[i]][j].close();//ここが動作しない 114 infoWindow["k2"][0].close();//これは動作する 115 console.log(infoWindow[markerKeys[i]][j]==infoWindow["k2"][0])//["k2"][0]のループの時にはtrueを返す 116 } 117 } 118 }) 119}) 120 121/*ckOpenボタンによりすべてのMarkerを表示する*/ 122$(function(){ 123 $('.ckOpen').on('click',function(){ 124 var markerKeys=Object.keys(marker); 125 var markerLen=markerKeys.length; 126 for (var i = 0; i < markerLen; i++) { 127 for (var j = 0, innerLen=Object.keys(marker[markerKeys[i]]).length; j <innerLen ; j++) { 128 marker[markerKeys[i]][j].setMap(map); 129 } 130 } 131 }) 132})
回答1件
あなたの回答
tips
プレビュー