2016-05-15 3 views
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イベントをどのように登録する必要がありますか?

+0

私はopenlayersの経験がないのでちょっと一言ですが、イベントハンドラは 'event'オブジェクトを受け取るので、' event.object.show() 'のようなものが動作しますか? (または多分 'event.element.show()') – DonovanM

+0

私はあなたが各マーカーのクリックハンドラを登録するのではなく、map.events.registerコントラクトを誤解していると思います(ハンドラは各マーカーに対して呼び出されるようです)。選択されたマーカーを表示するためにイベントオブジェクトを利用する単一のハンドラです。 – 42shadow42

+0

marker.popup = popupを使用してみてください。 foreach内でアソシエーションを作成し、map.events.register( 'click'、m、function(){ event.object.popup.show(); }})を使用します。ポップアップをトリガーします。 – 42shadow42

答えて

0

問題はかなりシンプルでした。代わりに、イベントをマーカーに登録するだけでした。私がどのようにサンプルから混ざったのか分かりませんが、マーカー自体がパラメータとして与えられているので混乱しているかもしれません。

m.events.register('click', m, (function(){ 
    this.show(); 
}).bind(p, null)); 
関連する問題