2012-10-03 25 views
2

我只能下載谷歌地圖API第3回調時是一個全球性的功能:加載Google Maps API時如何提供非全局回調?

function onMapLoad() { 
    alert('API is loaded'); 
} 

var script = new Element(
    'script', { 
     type: 'text/javascript', 
     src: 'http://maps.googleapis.com/maps/api/js?key=' 
      + Map.API_KEY 
      + '&sensor=false&callback=onMapLoad' 
    } 
); 

document.body.appendChild(script); 

我不想使用全局函數。相反,我想調用一個單例方法:Map.instance().onLoaded

// ... 
+ '&sensor=false&callback=Map.instance().onLoaded' 
// ... 

當我嘗試這樣做時,在加載Google腳本時出現NetworkError:403禁止。這似乎暗示Google的服務不喜歡我的回調函數字符串。回調函數本身沒有問題。

回答

0

嘗試使用谷歌裝載機呼叫

<script type="text/javascript" src="https://www.google.com/jsapi"></script>

google.load("maps", "3", {"other_params": "sensor=false","callback" : Map.instance().onLoaded });

https://developers.google.com/loader/

+0

根據該文件,'google.load'僅支持地圖V2。我在v3上試了一下,它說:「* Google Maps API服務器拒絕你的請求,請求中指定的」sensor「參數必須設置爲」true「或」false「。*」指定'other_params:{sensor:假}也沒有幫助。 – Pwner

+0

對不起,我應該把傳感器放在javascript行中試試google.load(「maps」,「3」,{「other_params」:「sensor = false」,「callback」:Map.instance()。onLoaded} );' –

+0

這個原因起作用的原因是加載器腳本將自己作爲回調函數進行發送,該回調函數將回調函數(parens'()')包含在函數中 –

0

它看起來像Google不喜歡函數調用()你的回調字符串的一部分,但它沒有任何問題,因爲它不是文件上的全局。

我也得到這樣一個403:

http://maps.googleapis.com/maps/api/js?key=4&sensor=false&callback=Map.mapLoaded%28%29

但不是這樣的:

http://maps.googleapis.com/maps/api/js?key=4&sensor=false&callback=Map.instance.mapLoaded

好像如果你可以只指定Map對象的功能屬性爲回調代替instance()函數的返回值,可以避免額外的全局。在他們的API中,我沒有看到任何關於此的內容,但我沒有花太多時間研究它。


我還沒有在很長一段時間使用JSONP戰術,所以我不知道這是否是JSONP的要求回調是全球性的或只是一些,谷歌強加的限制。這似乎是一個谷歌,唯一的事情,因爲這JSONP測試網站似乎都與括號作爲響應和小提琴表演沒有問題:

http://date.jsontest.com/?callback=Map.foo%28%29

小提琴:http://jsfiddle.net/6WawP/

希望這有助於