2013-09-27 59 views
0

當我插入x的值而不是使用for循環時,此代碼有效。但是當我使用for循環時,infowindow會在屏幕左側顯示扭曲。谷歌地圖api v3:infowindows扭曲

腳後跟!

爲(VAR X = 0; X < data.page_size; X ++){

var position = new google.maps.LatLng(
    data.events.event[x]['latitude'], 
    data.events.event[x]['longitude']); 

marker.push(
    new google.maps.Marker({ 
    position: position, 
    map: map, 
    icon: image} 
)); 

google.maps.event.addListener(marker[x], 'click', function() { 
    infowindow.setContent(content[x]); 
    infowindow.open(map, marker[x]); 
}); 

}

+1

在'click'回調中使用'this'而不是'marker [x]' –

回答

0

解決這個最經濟的方法是使標記每標記的一個數字財產的成本意識到自己的索引,並避免需要形成一套含複印件倒閉content[x]

for (var x = 0; x < data.page_size; x++) { 
    ... 
    marker[x].x = x;//make the marker aware of its own index 
    google.maps.event.addListener(marker[x], 'click', function() { 
     infowindow.setContent(content[this.x]); 
     infowindow.open(map, this); 
    }); 
} 

提供了陣列和content陣列保持靜止,或者是兼容地進行管理,則this.x將可靠地拉出的每個標記的正確內容。

1

必須使用在這種情況下閉合。就像這樣:

(function(m,c){ 
    google.maps.event.addListener(m, 'click', function() { 
     infowindow.setContent(c); 
     infowindow.open(map, m); 
    }); 
})(marker[x],content[x]) 
+0

形成故意關閉可能是一件好事,但在這種情況下不是出於兩個原因。 (a)'marker [x]'在監聽器中是'this',正如Dr.Molle在上面指出的那樣,(b)'content [x]'可能是一個字符串(它可能是一個節點,但我們不知道)。如果它是一個字符串,那麼它將在形成閉包時由值賦值;換句話說,將會有所有內容字符串的兩個副本,一個在原始數組中,另一個在一組關閉中 - 對RAM的經濟不利。 –

+0

@ Beetroot-Beetroot:由於字符串在JS中是不可變的,所以我們可以假設JS引擎優化這個並且在按值分配時共享它們。不過,引入閉包(對於'x')比在(外部)'Marker'實例上分配自定義'x'屬性要好。 – Bergi

+0

感謝@Bergi。我可能在這裏的時代背後。回想起來(近二十年),有人說(請不要問我在哪裏)安全的假設是字符串按價值傳遞(儘管是不可變的)。我期望早期的ECMAScript實現將語言規範解釋爲彼此不同。我注意到,今天的評論員一般認爲字符串是通過引用傳遞的,儘管語言規範在這一點上似乎是非常規的。 –