0

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

谢谢!

4

2 回答 2

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();
    });
于 2013-10-11T11:17:12.757 回答
0

事件处理程序实际上可以获得一个参数(事件),这是执行此操作的惯用方式。此外,最好将处理程序绑定到层而不是每个标记。

markerLayer.events.register('click', marker,
      function(event) {
          var feature = event.feature;
          /* make popup appear */
  });

制作弹出窗口的方式会根据您的需要而有所不同,但通常弹出窗口是在这里按需创建的,而不是预先生成和调用 show。

于 2013-10-14T05:29:23.210 回答