2011-09-03 57 views
2

嘿,我正在鬼混谷歌地圖API,目前我正在努力實現一些我認爲會相當直接的事情。使用谷歌地圖API時的Javascript範圍問題

我的朋友想要在他的網站上有一個訪問者地圖的東西,訪問者可以在地圖上的任何點添加一個標記,每個標記都會有與之相關的信息。諸如名稱,日期,消息等的信息...

現在我正處於原型設計和學習階段,但我在將infowindow與對象關聯時遇到問題。

var map; 
var markers = [] 
function init(){ 
     var latlng = new google.maps.LatLng(-44, 140); 
     var myOptions = { 
       zoom:8, 
       center: latlng, 
       mapTypeId: google.maps.MapTypeId.ROADMAP 
     }; 

     map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 


     google.maps.event.addListener(map, 'click', function(event){ 
      markers.push(new marker(event.latLng)); 
     }); 
} 

function marker(location){ 
    this.location = location; 
    this.mark = new google.maps.Marker({position:this.location, map:map}); 
    this.info = new google.maps.InfoWindow({content:'hi'}); 
    google.maps.event.addListener(this.mark, 'click', function(){ 
     this.info.open(map, this.mark); 
    }); 
} 

當我測試此代碼出了標誌放置很好,但是當我點擊,而不是顯示的信息窗口在他們身上,我得到這個錯誤在JS控制檯:

Uncaught TypeError: Cannot call method 'open' of undefined 

當然這是範圍問題,但我不明白爲什麼應該如此。類似這樣的工作正常:

function test(a){ 
    this.a = a 
    this.b = function(){ 
     this.a+=1 
    } 
} 

非常感謝您的幫助!

回答

3

看起來你在這裏失去範圍:

google.maps.event.addListener(this.mark, 'click', function(){ 
    this.info.open(map, this.mark); 
}); 

嘗試存儲this值,像這樣:

實現你想可能是通過使這個什麼
var _self = this;  
google.maps.event.addListener(_self.mark, 'click', function(){ 
    _self.info.open(map, _self.mark); 
}); 
+0

感謝它的工作,但我注意到這個解決方案的一個信息框,當它出現是所有碎片...可能是由於它被稱爲以這種方式? http://jsfiddle.net/8xHw7/ – danem

+0

剛試過它在你的鏈接,似乎它對我來說工作得很好:) – VNO

+0

真的嗎?你看不到通過infowindow的這些線條?也許這是鉻... – danem

2

的一種方式。 info作爲你與click事件關聯的函數的參數,然後在傳遞的參數上使用'open'。這應該可以解決問題。

爲什麼這個函數不能識別this.info的原因是函數沒有被定義爲一個內部函數。