1
OpenStreetMapsおよびonClickにマーカーを追加しようとしているところに、次のコードがあります。 lonLatsは、プロパティlon、lat、およびtextを持つオブジェクトを持つ配列です。コードはおおよそ次のとおりです。OpenLayersイベントを無名関数またはバインドでも登録すると、JavaScriptのクロージャがループ内でトリガーされます
<div id="mapdiv"></div>
<script src="http://www.openlayers.org/api/OpenLayers.js"></script>
<script>
var map = new OpenLayers.Map("mapdiv");
map.addLayer(new OpenLayers.Layer.OSM());
var projection = new OpenLayers.Projection("EPSG:4326"); // transform from WGS 1984
var mapProjection = map.getProjectionObject(); // // to Spherical Mercator Projection
var zoom=16;
var markers = new OpenLayers.Layer.Markers("Markers");
map.addLayer(markers);
map.setCenter (new OpenLayers.LonLat(lonLats[0].lon, lonLats[1].lat).transform(projection, mapProjection), zoom);
lonLats.forEach(function(el){
var lonLat = new OpenLayers.LonLat(el.lon, el.lat).transform(projection, mapProjection);
var marker = new OpenLayers.Marker(lonLat);
markers.addMarker(marker);
var popup = new OpenLayers.Popup.FramedCloud("",
marker.lonlat,
new OpenLayers.Size(200, 200),
el.text,
null, true);
(function(p, m){
map.addPopup(p);
p.hide();
map.events.register('click', m, (function(){
this.show();
}).bind(p, null));
})(popup, marker);
});
</script>
基本的にマーカーの1つをクリックすると、すべてのポップアップが表示されます。これは古典的なJavaScriptクロージャトラップのようですが、私がクリックしているマーカーを1つだけトリガーするように、OpenLayersイベントをどのように登録する必要がありますか?
私はopenlayersの経験がないのでちょっと一言ですが、イベントハンドラは 'event'オブジェクトを受け取るので、' event.object.show() 'のようなものが動作しますか? (または多分 'event.element.show()') – DonovanM
私はあなたが各マーカーのクリックハンドラを登録するのではなく、map.events.registerコントラクトを誤解していると思います(ハンドラは各マーカーに対して呼び出されるようです)。選択されたマーカーを表示するためにイベントオブジェクトを利用する単一のハンドラです。 – 42shadow42
marker.popup = popupを使用してみてください。 foreach内でアソシエーションを作成し、map.events.register( 'click'、m、function(){ event.object.popup.show(); }})を使用します。ポップアップをトリガーします。 – 42shadow42