マップ上にいくつかのマーカーが(配列内に)あり、それぞれに指定したカスタムIDタグが付いています。
必要なもの:マーカーをクリックしたときに、そのIDを別の配列に追加したいと思います。
問題:Googleのマウスイベントにはターゲット属性がなく、位置のみが含まれているため、IDに直接アクセスできないようです。
位置を使用してそれに最も近いマーカーを見つけ、この方法でIDを返すことに頼る必要はありません。かなり複雑です。
すべての助けに感謝します
マップ上にいくつかのマーカーが(配列内に)あり、それぞれに指定したカスタムIDタグが付いています。
必要なもの:マーカーをクリックしたときに、そのIDを別の配列に追加したいと思います。
問題:Googleのマウスイベントにはターゲット属性がなく、位置のみが含まれているため、IDに直接アクセスできないようです。
位置を使用してそれに最も近いマーカーを見つけ、この方法でIDを返すことに頼る必要はありません。かなり複雑です。
すべての助けに感謝します
JavaScriptやクロージャと呼ばれる他の多くの言語の機能のおかげで、これは本当に簡単です。
マーカーを作成し、そのイベントリスナーを関数内に設定するコードを配置し、その特定のマーカーに必要なデータを使用して、マーカーごとにその関数を呼び出すだけです。例えば:
var places = [
{
id: 'one', lat: 1, lng: -1, name: 'First'
},
{
id: 'two', lat: 2, lng: -2, name: 'Second'
}
];
for( var i = 0; i < places.length; i++ ) {
addPlace( places[i] );
}
function addPlace( place ) {
var marker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng( place.lat, place.lng ),
title: place.name
});
google.maps.event.addListener( 'click', function() {
alert( 'Clicked ' + place.id + ': ' + place.name );
});
}
このMapsAPIコードはテストしていませんが、コードの詳細は重要ではありません。理解しておくべき重要なことはplace
、コードで使用されている変数です。これが重要な部分です。イベントリスナーがパラメータとしてaddPlace()
持つ関数内にネストされているという理由だけで、その変数はイベントリスナー内でアクセス可能です。place
そのコードとこのようなコードの違いに注意してください。これは機能しません。
for( var i = 0; i < places.length; i++ ) {
var place = places[i];
var marker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng( place.lat, place.lng ),
title: place.name
});
google.maps.event.addListener( 'click', function() {
alert( 'Clicked ' + place.id + ': ' + place.name );
});
}
2つの違いは、作業バージョンでは、すべてのコードをループ内に直接配置するのではなく、ループ本体をループから呼び出される別の関数に配置することだけです。毎回呼び出す関数にそのコードを含めると、クロージャーが作成されます。これにより、内部イベントリスナー関数が外部関数の変数を「参照」できるようになります。
クロージャーの優れている点は、同様の状況でクロージャーを使用できることです。これは、MapsAPIまたはAPIが使用するオブジェクトに固有のものではありません。たとえば、次のsetTimeout()
ような呼び出しで、すでにそれらを使用していて、気付いていない場合もあります。
// Display an alert 'time' milliseconds after this function is called
function slowAlert( message, time ) {
setTimeout( function() {
alert( message );
}, time );
}
slowAlert( 'Howdy!', 1000 ); // Wait a second and then say Howdy!
alert()
コールバック関数内で呼び出しが行われる場合、関数setTimeout()
のクロージャーを使用して、その関数に渡されslowAlert()
た変数の値を取得します。message
これは役立つはずです。マーカーオブジェクトにプロパティを追加customId
し、マーカーclick
イベントでidプロパティを新しい配列に割り当てます。
function initialize() {
var map;
var centerPosition = new google.maps.LatLng(38.713107, -90.42984);
var options = {
zoom: 6,
center: centerPosition,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var bounds = new google.maps.LatLngBounds();
map = new google.maps.Map($('#map')[0], options);
var infoWindow = new google.maps.InfoWindow();
//marker array
var markers = [];
//sencondary array to store markers that were clicked on.
var markerIdArray = [];
for (i = 0; i < 6; i++) {
var lat = 38.713107 + Math.random();
var lng = -90.42984 + Math.random();
var marker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng(lat, lng),
customId: i //add a custom id to the marker
});
bounds.extend(marker.position);
google.maps.event.addListener(marker, 'click', function () {
//add the id to the other array.
markerIdArray.push(this.customId);
//log the content of the array to the console.
console.log(markerIdArray);
});
markers.push(marker);
}
map.fitBounds(bounds);
}
これが実際の例です。