У меня есть следующий код, где я пытаюсь добавить некоторые маркеры в OpenStreetMaps и onClick, они будут запускать собственное всплывающее окно. lonLats - это массив с объектами со свойствами lon, lat и text. Код примерно следующий.Закрытие JavaScript вызывает все внутри цикла при регистрации события OpenLayers даже с анонимной функцией или связыванием
<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>
Так что, когда я нажимаю на один из маркеров, все всплывающие окна становятся видимыми. Это похоже на классическую ловушку закрытия JavaScript, но как мне зарегистрировать событие 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