2012-11-05 60 views
1

我正在使用Google Maps API的小型web應用程序。JavaScript中的函數調用

在一個點上,我想放置標記並附加事件監聽器。

//initialization of infowindow and markers 
var points = []; 
var infowindow = new google.maps.InfoWindow({ 
    content: "1234" 
}); 

function addInfoWindow(point){ 
    infowindow.setContent(point.position + " " + point.title), 
    infowindow.open(map, point); 
} 

這裏的問題,當我啓動標誌物

//initialize markers 
{% for marker in mapMarkers %} 
    points[{{ marker.id }}] = new google.maps.Marker({ 
     position: new google.maps.LatLng({{ marker.geometry.y }}, 
      {{ marker.geometry.x }}), 
     map: map, 
     title: '{{ marker.name }}', 
     clickable: true 
    }); 

    //add event llistener for infowindow 
    points[{{ marker.id }}].content = "abc" 
    //look here!! 
    google.maps.event.addListener(points[{{ marker.id }}], 'click', 
     addInfoWindow(points[{{ marker.id }}]) 
    ); 
{% endfor %} 

它會立即從第一標記顯示信息窗口。其他標記被放置,但點擊它們從不產生任何改變。

雖然如果我這樣做

google.maps.event.addListener(points[{{ marker.id }}], 'click', 
    function(){ 
     addInfoWindow(points[{{ marker.id }}]) 
    }); 

東西工作完全正常,只有信息窗口被點擊標記時出現。

我的問題:爲什麼需要使用

function(){}
而不是直接使用addInfoWindow。我想這可能是addInfoWindow調用全局變量的函數調用問題,但如果是這種情況,顯示的infowindow應顯示來自最後一個標記實例化的信息?

+0

因爲'addInfoWindow'需要參數。如果您只是使用函數引用,它將不會收到任何參數。 –

回答

2

因爲你需要分配的功能click處理 - 和你這樣做有...

google.maps.event.addListener(points[{{ marker.id }}], 'click', 
function(){ 
    addInfoWindow(points[{{ marker.id }}]) 
}); 

...因爲這將(在其體內與調用addInfoWindow)創建一個匿名函數。

但有了這個...

google.maps.event.addListener(points[{{ marker.id }}], 'click', 
    addInfoWindow(points[{{ marker.id }}]) 
); 

...你嘗試分配結果addInfoWindow調用作爲事件處理程序,而不是函數本身的。當然,它不起作用。