我正在尝试为每个标记附加一个Popup(我正在使用OpenLayers和OpenStreetMaps)。每个标记都会注册一个事件“点击”,它会显示相应的弹出窗口。
然而,它的作用是在启动时执行所有弹出窗口,而不是等待给定的标记点击。
大约有1000个标记,所以我使用这个循环来填充标记和弹出窗口(在创建时隐藏):
for (var i = 0; i < data.length; i++)
{
if (i == 1) {
var lonLat = new OpenLayers.LonLat(data[i].Lon, data[i].Lat).transform(fromProjection, toProjection);
var zoom = 5;
map.setCenter(lonLat, zoom);
}
var lonLat = new OpenLayers.LonLat(data[i].Lon, data[i].Lat).transform(fromProjection, toProjection);
AddingPopup(lonLat);
AddingMarker(i, lonLat);
这些是我创建两者的功能:
function AddingMarker(i, lonLat) {
var marker = new OpenLayers.Marker(lonLat);
markers.addMarker(marker);
marker.events.register('click', marker, PopupsShow(i));
};
function AddingPopup(lonLat) {
var popup = new OpenLayers.Popup("Popup", lonLat, null, "text", true);
map.addPopup(popup);
popup.hide();
};
这是在执行时为所有标记自动触发的函数:
function PopupsShow(i) {
map.popups[i].show();
};
我在这里缺少什么。为什么PopupsShow函数在执行时启动,而不是等待单击标记。我一直在寻找答案,但似乎没有任何帮助。
谢谢!
答案 0 :(得分:1)
我已经弄明白了:
我们无法使用marker.events.register("click", marker, PopupsShow(i))
相反,我们需要这样称呼它:marker.events.register("click", marker, PopupsShow)
由于我们需要i
,我们可以这样称呼它:
marker.events.register("click", marker, function () {
map.popups[i].show();
});
答案 1 :(得分:1)
事件处理程序实际上可以获得一个参数(事件),这是执行此操作的惯用方法。此外,最好将处理程序绑定到图层而不是每个标记。
markerLayer.events.register('click', marker,
function(event) {
var feature = event.feature;
/* make popup appear */
});
制作弹出窗口的方式各不相同,以满足您的需求,但通常弹出窗口是按需创建的,而不是预生成和调用show。