モバイルウェブアプリを作っています。
アプリの一部はいくつかのマーカーをドロップし、クリックして情報ウィンドウを開くことができます。iOSマップアプリのように、承認せずにマップを使い続けても、これらが消えないのはイライラします。
ユーザーが基になるマップをクリックした場合に、開いているすべての情報ウィンドウが閉じられるように設定する方法はありますか?
モバイルウェブアプリを作っています。
アプリの一部はいくつかのマーカーをドロップし、クリックして情報ウィンドウを開くことができます。iOSマップアプリのように、承認せずにマップを使い続けても、これらが消えないのはイライラします。
ユーザーが基になるマップをクリックした場合に、開いているすべての情報ウィンドウが閉じられるように設定する方法はありますか?
これを試して:
google.maps.event.addListener(map, "click", function(event) {
infowindow.close();
});
それは非常に単純で、同様に機能するはずです。
マップのクリックイベントにリスナーを追加し、ハンドラーのインフォボックスを閉じます
google.maps.event.addListener(map, "click", function(event) {
for (var i = 0; i < ibArray.length; i++ ) { //I assume you have your infoboxes in some array
ibArray[i].close();
}
});
私は一般的なウェブサイトでそれを行いますが、モバイルで機能しない理由はわかりません
google.maps.event.addListener(marker, 'click', function() {
if(!marker.open){
infoWindow.open(map,marker);
marker.open = true;
}
else{
infoWindow.close();
marker.open = false;
}
google.maps.event.addListener(map, 'click', function() {
infoWindow.close();
marker.open = false;
});
});
完璧に動作します
私は他の答えにいくつかの問題があることに気づきました。
マーカス・ロンメルとスラウェクウィンの答え:
マーカーがクリックされると、その後マップクリックイベントが発生します。したがって、マーカークリックでウィンドウが開くと、クリックイベントがマップに伝播すると、すぐにウィンドウが再び閉じます。
user1724001の回答:
マーカーがクリックされるたびにリスナーを作成することもお勧めできません。これはメモリを汚染します。
したがって、マップへのイベントの伝播を停止するために、最初の回答にいくつかの追加情報を追加したいと思います。マーカーがクリックされていない場合にのみ、Windowsが閉じられます。
marker.addListener("click", function(event) {
// open your window here
event.stopPropagation(); // this prevents propagation of marker click to map click
});
map.addListener("click", function() {
// close your window
});
私はすべてのシナリオに対してより良い解決策を持っています。
これを試してください:JSFiddle
const infoWindow = new google.maps.InfoWindow();
function init() {
const map = new google.maps.Map(document.getElementById('map'), {
zoom: 6,
center: new google.maps.LatLng(39.9646, 30.8259),
mapTypeId: google.maps.MapTypeId.TERRAIN
});
map.addListener('click', () => {
if (infoWindow) {
infoWindow.close();
}
});
const istanbulMark = new google.maps.Marker({
position: new google.maps.LatLng(41.0876, 28.9288),
map: map,
label: 'I'
});
istanbulMark.addListener('click', () => {
infoWindow.setContent(`
<h1>Hi mate</h1>
<hr>
<p>Welcome to İstanbul!</p>
`)
infoWindow.open(map, istanbulMark);
});
const ankaraMark = new google.maps.Marker({
position: new google.maps.LatLng(39.9162, 32.8437),
map: map,
label: 'A'
});
ankaraMark.addListener('click', () => {
infoWindow.setContent(`
<h1>Hi mate</h1>
<hr>
<p>Welcome to Ankara!</p>
`)
infoWindow.open(map, ankaraMark);
});
}
google.maps.event.addDomListener(window, 'load', init);
html, body, #map {
height: 100%;
margin: 0px;
padding: 0px
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true">
</script>
</head>
<body>
<div id="map"></div>
</body>
</html>