2013-01-06 44 views
27

我正在編寫一個應用程序,它可以通過手動構建的框架異步加載Google Maps。
當我加載地圖時,由於某種原因它不會加載所有的地圖,我將以Uncaught TypeError: undefined is not a function結束。我檢查了鉻檢查員,發現google.maps是一個有效的對象,但它沒有自己的屬性。在文檔加載後,我會手動調用「初始化函數」。我究竟做錯了什麼?!異步Google Maps API v3 undefined不是函數

+1

或許有些代碼(你的「手工構建的框架將是一個開始)?一個鏈接到一個頁面展示了這個問題?一個jsfiddle呢? – geocodezip

+1

閱讀文檔是一個好的開始[**請參閱**](https://開發人員。 google.com/maps/documentation/javascript/tutorial#asynch) –

回答

71

你不能用衆所周知的URL(http://maps.googleapis.com/maps/api/js?v=3&sensor=false

當你看看腳本文件,你會看到加載地圖的API異步的,這是不是該API被加載,它是一個加載API的加載器。加載器使用document.write(),在文檔加載完成後調用什麼會導致意外的結果。

此外,文檔的onload事件不會等待異步加載的對象,它可能會過快。

您也不能使用腳本的load-event來調用初始化函數,因爲當它觸發時,加載器被加載,而不是地圖API。

怎麼辦:
追加一個回調參數的腳本URL(用初始化函數的值的名稱)

http://maps.googleapis.com/maps/api/js?v=3&sensor=false&callback=initialize

現在你會得到一個不同的裝載機,其:

  1. 不使用document.write()
  2. 調用回調functi上(初始化)時,地圖的API已經被加載

演示:http://jsfiddle.net/doktormolle/7cu2F/


相關評論似乎回調必須是直接連接到窗口的功能。不冷靜的谷歌:)

沒有支持的功能引用使用另一種選擇,the google-API-loader(而不是函數的名稱)。

樣品,其中異步地加載的地圖的API,但只有當存在與文檔中的ID map-canvas的元素,然後創建地圖:

window.addEventListener('load',function(){ 
 
     if(document.getElementById('map-canvas')){ 
 
     google.load("maps", "3",{ 
 
      callback:function(){ 
 
      new google.maps.Map(document.getElementById('map-canvas'), { 
 
       center: new google.maps.LatLng(0,0), 
 
       zoom: 3 
 
       }); 
 
      } 
 
     });  
 
     } 
 
    },false);
 body,html,#map-canvas{ 
 
     height:100%; 
 
     margin:0; 
 
     padding:0; 
 
     width:100%; 
 
     }
<script src="https://www.google.com/jsapi?.js"></script> 
 
<div id="map-canvas"></div>

+0

好的,謝謝你的inf O操作。我不想使用'callback = initialize',因爲我想在初始化函數中傳遞一些額外的參數,但我想我必須解決它。 – Stephen

+1

這正是我所尋找的 – Stephen

+0

似乎'回調'必須是直接附加到窗口的函數。不是很酷的谷歌:) – apneadiving

相關問題