events.register自动执行正在注册的事件

时间:2013-10-11 10:47:27

标签: javascript openlayers openstreetmap

我正在尝试为每个标记附加一个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函数在执行时启动,而不是等待单击标记。我一直在寻找答案,但似乎没有任何帮助。

谢谢!

2 个答案:

答案 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。