私はgooglemaps api 3.9を使用しています。アプリ内でユーザーはマーカーを追加または削除できます。ユーザーが地図をクリックすると、情報ウィンドウが表示されます。ユーザーは名前、緯度、経度を入力し、次のように画像を保存をクリックできます。
google.maps.event.addListener(map, 'click', function(event) {
point = new google.maps.Marker({
position: event.latLng
, map: map
, icon: 'resource/image/mapIcons/point.png'
, id: id
, type:"point"
});
type = point.type;
newPoint = true;
existingPoint = false;
markerObj = this;
inputInfowindow.setContent("<table style='width:92%;' id='inputTable'>" +
"<tr> <td>point</td> </tr>" +
"<tr> <td><input class='infoInput' type='text' id='name' placeholder='name'/> </td> </tr>" +
"<tr> <td><input class='infoInput'type='text' id='lat' placeholder='latitude'/></td> </tr>" +
"<tr> <td><input class='infoInput'type='text' id='lon' placeholder='longitude'/></td> </tr>" +
"<tr><td><input type='image' src='resource/image/mapIcons/save.png' onclick='save()' class='saveImage' alt='save'/> </td></tr>");
event1 = event.latLng;
currentMarker = point;
inputInfowindow.open(map,point);
});
dBに保存されたマーカー。ユーザーが削除ボタンをクリックすると、次のメソッドが呼び出されます。
function deleteMarker(id,rev) {
var marker = markerObj;
markerObj = undefined;
var x = confirm("are you sure to delete marker?");
if(x){
deleteLocations(id,rev);//removes marker details from DB
if(marker){
console.log(marker);
marker.setMap(null);
}
}
}
しかしmarker.setMap(null);マーカーはマップから削除されますが、マップ上にあります。console.log(marker);で確認しました。マーカーオブジェクトが正しく表示され、コンソールにエラーはありません。グーグルを何度も実行しましたが、結果はありません。これについては助けてください。
ドキュメントから-
マップからオーバーレイを削除するには、オーバーレイのsetMap()メソッドを呼び出し、nullを渡します。このメソッドを呼び出してもオーバーレイは削除されないことに注意してください。それは単にマップからオーバーレイを削除します。代わりにオーバーレイを削除する場合は、マップからオーバーレイを削除してから、オーバーレイ自体をnullに設定する必要があります。
したがって、marker.setMap(null)
の後に、marker=null
も記述する必要があります。
Update1-
function deleteMarker(id,rev) {
var x = confirm("are you sure to delete marker?");
if(x)
{
deleteLocations(id,rev);//removes marker details from DB
if(markerObj)
{
console.log(markerObj);
markerObj.setMap(null);
markerObj=null;
}
}
}
更新2-
これが機能する簡単なデモです。コードを見て、コードが間違っている場所を確認してください。おそらく、コードにいくつかの可変スコープの問題が存在します。
私も同じ問題を抱えていました。 markers[index].setMapp(null)
の前にこれらのメソッドを呼び出す必要があります:
_map.setCenter(desMarker[index].getPosition());
desMarker[index].setPosition(null);
_
これらの呼び出しの後:
markers[index].setMapp(null)
同様のエラーが発生しましたが、私の解決策があなたのケースに当てはまるかどうかはわかりません。それでも、ページが読み込まれたときに、データベースに示されている座標からのマーカーでマップがいっぱいになるようにコードを設定しました。次に、ユーザーがデータベースにポイントを追加できるようにしてから、地図上でユーザーが選択した場所にマーカーを追加しました。
私が気付いていなかったのは、データベースで座標が変更または作成されるたびに、コードがマップ上のすべての座標にマーカーを再追加していたことです。したがって、ポイントを作成するときはいつでも、手動で座標にマーカーを追加し、データベースは座標にマーカーを追加していました。したがって、コードが壊れていると思ったとき、実際に起こっていたのは、同じ場所にある2つのポイントのうちの1つを削除していたことです。
したがって、データベースから座標とマーカーをどのように取得しているかは正確にはわかりませんが、調べる価値はあります。
マップクリックイベントで、thisをmarkerObjに割り当てます。 thisは、マーカーオブジェクトではなく、マップオブジェクトを参照しますが。
に変更します
markerObj = point;
期待どおりに機能するはずです。
marker.setMap(null)
はオブジェクトを削除せず、非表示にするだけです。削除するにはmarker = null;