2011-09-04 62 views
0

我一直在研究一個涉及Google Maps API的簡單項目。我的朋友需要訪問者的地圖,訪問者可以在其中放置代表他們位置的標記。這些標記還與名稱,消息等數據相關聯。單擊標記時,此數據應顯示在InfoWindow中。Javascript字符串意外轉向對象

到目前爲止,它的所有工作都很好,但是我遇到了一個讓我難過的bug。

當用戶放下新點時,會調用一個函數來生成該對象特定的表單。

function setupForm(id){ 
    var content='<div class="gdform">'+ 
      '<form id='+id+'>'+ 
      '<ul>'+ 
      '<li><input type="text" id="userName" value="name" onfocus="value=\'\'"/></li>'+ 
      '<li><textarea rows ="15" cols="50" wrap="hard"></textarea></li>'+ 
      '</ul>'+ 
      '<input type="button" value="submit" onclick="markers.'+id+'.setData()"/>'+ 
      '<input type="button" value="cancel" onclick="setTimeout(function(){removeMark('+id+')}, 100)"/>'+ 
      '</form>'+ 
      '</div>'; 
return content; 

} 

其中id是地圖上每個標記的唯一標識。這些標記存儲在一個散列表中,並可以用這個ID引用。

這裏的問題來自取消按鈕。按下時,它應該關閉InfoWindow,從地圖上移除標記,並從哈希表中刪除標記。要做到這一點,它調用函數removeMark,它看起來像這樣:

function removeMark(id){ 
    infoWindow.close() 
    markers.id.mark.setMap(null); 
    delete markers.id; 

} 

然而在這裏,我收到一個類型的錯誤告訴我它無法讀取的未定義的屬性標誌。

在嘗試調試代碼時,我設置了一些斷點,一個在setupForm函數中,另一個在removeMark中。在單步執行代碼時,我注意到,在setupForm中,js控制檯將id識別爲字符串。但是,在removeMark中,js控制檯通知我,id突然成爲對象。

我一直無法弄清楚爲什麼這應該是。 這裏是所有代碼:

http://jsfiddle.net/39vKm/

感謝您的幫助!

+0

你setTimeout調用是錯誤的。第一個參數應該是一個函數,而不是函數調用。 – ThiefMaster

+0

啊,好吧,我不知道你不能這麼做......我已經改成setTimeout(function(){removeMark('+ id +')},100)'。然而,我仍然有與成爲一個對象的字符串相同的問題... – danem

回答

1

好吧......有三個問題,你的代碼...

首先,你錯過了周圍的onclick declatation的ID報價單上的取消按鈕。其次,你需要從removeMark函數返回false,按鈕上的onclick事件返回removeMark ...(有沒有需要超時)

CODE:

function setupForm(id){ 
    var content='<div class="gdform">'+ 
       '<form id='+id+'>'+ 
       '<ul>'+ 
       '<li><input type="text" id="userName" value="Whats your name?" onfocus="value=\'\'"/></li>'+ 
       '<li><textarea rows ="15" cols="50" wrap="hard"></textarea></li>'+ 
        '</ul>'+ 
       '<input type="button" value="submit" onclick="markers.'+id+'.setData()"/>'+ 
       '<input type="button" value="cancel" onclick="return removeMark(\''+id+'\')"/>'+ 
       '</form>'+ 
       '</div>'; 
    return content; 

} 

三,拆卸時標記,你需要引用使用括號標記陣列上...

function removeMark(id){ 
    infoWindow.close() 
    markers[id].mark.setMap(null); 
    delete markers[id]; 
    return false; 
} 

更新小提琴:http://jsfiddle.net/gislikonrad/39vKm/5/

+0

啊,它完美的作品,感謝您的幫助。我只是想知道......爲什麼我的錯誤導致了我所看到的錯誤?另外,爲什麼有必要在removeMark上返回false? – danem

+0

嘗試運行以下代碼時發生錯誤:removeMarker(t1342352324)如果t1342352324是標記ID。問題是你沒有引用id,這意味着代碼運行了一個名爲t1342352324的變量的removeMarker。然後,如果您在removeMark中沒有返回false(並且隨後未在onclick事件中返回removeMark),那麼點擊事件將在地圖上再次運行,並且在取消按鈕所在的地圖上設置新標記。 .. – gislikonrad

+0

啊,好吧,所以這就是爲什麼它是我點擊時添加一個新的標記。 setTimeout()最初是爲了解決這個問題。謝謝您的幫助! – danem

相關問題