2013-10-11 22 views
0

我想附加每個標記的Popup(我使用OpenLayers和OpenStreetMaps爲此)。每個標記正在註冊一個事件'點擊',將顯示相應的彈出窗口。events.register是自動執行正在註冊的事件

但是,它所做的只是在啓動時執行所有彈出窗口,而不是等待給定的標記點擊。

有大約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函數在執行時啓動,並且不等待點擊標記。我一直在尋找答案,但似乎沒有任何幫助。

謝謝!

回答

1

我已經想通了:

我們不能註冊使用marker.events.register("click", marker, PopupsShow(i))

相反,我們需要調用它像這樣的事件:marker.events.register("click", marker, PopupsShow)

而且因爲我們需要的i我們可以這樣稱呼它這個:

​​
1

事件處理函數實際上可以得到一個參數(事件),這是慣用的wa執行此操作。此外,最好將處理程序綁定到圖層而不是每個標記。

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

做一個彈出的方式不同,以滿足您的需求,但需求在這裏,而不是預生成和調用顯示創建通常彈出。