2013-06-26 27 views
3

我最近更新了最近使用的PhoneGap/Cordova版本。我的應用中有一個頁面在每次加載時都會拋出以下錯誤。Android錯誤「Uncaught Reference Error:谷歌未定義」Android PhoneGap

Uncaught Reference Error: google is not defined

我試圖直接使用一個樣本網頁從谷歌開發者的網站,試圖縮小我的選擇,並且仍然有嘗試加載我的手機上那個網頁時同樣的錯誤。 (在這裏找到:https://developers.google.com/maps/documentation/javascript/examples/map-simple)。我應該注意到,在谷歌上運行這個網頁時,我的桌面上的Chrome中的.HTML文件運行良好。

我也試過用在這裏找到了解決辦法:Google Maps API throws "Uncaught ReferenceError: google is not defined" only when using AJAX

然而initialize方法從未甚至稱,這使我相信這是我的腳本標記一個問題,我仍下落不明。

至於我可以告訴大家,我是用正確的腳本調用我的HTML:

<script type="text/javascript" src="cordova.js"></script> 
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?<KEY>&sensor=false"></script> 

和崩潰的JavaScript代碼如下:

origins[0] = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); 

完整的代碼在這裏:

<!DOCTYPE HTML> 
<html> 
<head> 
<title>MASH Locations</title> 
<meta name="viewport" 
    content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no" /> 
<link rel="stylesheet" type="text/css" href="styles/layout.css" /> 
<script type="text/javascript" src="cordova.js"></script> 
<script type="text/javascript" 
    src="http://maps.googleapis.com/maps/api/js?key=(myAppKey)&sensor=false"></script> 
<script type="text/javascript" charset="utf-8" src="Util.js"></script> 
<script type="text/javascript" charset="utf-8" src="QuickSort.js"></script> 
<script type="text/javascript" charset="utf-8" src="Location.js"></script> 
<script type="text/javascript"> 
    var origins, destinations; 
    var BORDER_ROW = '<tr><td colspan="3" class="location-result-border">&nbsp;</td></tr>'; 
    var RESULT_FORMAT = '<tr><td id="result_{7}" class="location-result-row" onclick="onLocationResultClick(\'{0}\', \'{1}\', \'{2}\', \'{3}\', \'{4}\', \'http://cloud.intelligentbits.net/mash/images/{5}\', \'{6}\')">' 
     + '<table class="{8}">' 
     + '<tr><td class="location-result-distance" rowspan="3"><div>{9}</div>miles</td>' 
     + '<td class="location-result-logo" rowspan="3"><img src="http://sqldb.intelligentbits.net/mash/images/{5}" alt="{0}" /></td>' 
     + '<td class="location-result-name">{0}</td></tr>' 
     + '<tr><td class="location-result-address">{10}</td></tr>' 
     + '<tr><td class="location-result-city">{11}</td></tr></table></td></tr>'; 

    function onLoad() 
    { 
     // Wait for PhoneGap to load 
     document.addEventListener("deviceready", onDeviceReady, false); 
    } 

    // PhoneGap is ready 
    function onDeviceReady() 
    { 
     navigator.geolocation.getCurrentPosition(onPositionFound, onPositionError); 
    } 

    function onPositionFound(position) 
    { 
     // get the current location 
     origins = new Array(); 
     origins[0] = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); 

     document.getElementById('finding').innerText = 'Finding our locations...'; 
     readFile('http://sqldb.intelligentbits.net/mash/locations.txt', onLocationsFound); 
    } 

    // onPositionError Callback receives a PositionError object 
    function onPositionError(error) 
    { 
     alert('code: ' + error.code + '\n' + 
       'message: ' + error.message + '\n'); 
    } 

    function onLocationsFound(text) 
    { 
     if (text == null || text.length == 0) 
     { 
      document.getElementById('finding').innerText = 'An error occurred.'; 
      return; 
     } 

     // split the text into lines (one line per location) 
     var lines = text.split(/\r?\n/g); 
     if (lines.length == 0) 
     { 
      document.getElementById('finding').innerText = 'An error occurred.'; 
      return; 
     } 

     // destinations 
     destinations = new Array(); 
     var locIdx = 0; 

     // iterate over lines/locations 
     for (var i = 0; i < lines.length; ++i) 
     { 
      // split into fields 
      var loc = new Location(); 
      var fields = lines[i].split(';'); 

      for (var j = 0; j < fields.length; ++j) 
      { 
       // split fields into name and value 
       var tokens = fields[j].split('='); 
       if (tokens.length != 2) continue; 

       switch (tokens[0].toUpperCase()) 
       { 
        case 'NAME': 
         loc.Name = tokens[1]; 
         break; 
        case 'ADDRESS': 
         loc.StreetAddress = tokens[1]; 
         break; 
        case 'CITY': 
         loc.City = tokens[1]; 
         break; 
        case 'STATE': 
         loc.Region = tokens[1]; 
         break; 
        case 'POSTAL': 
         loc.PostalCode = tokens[1]; 
         break; 
        case 'PHONE': 
         loc.Phone = tokens[1]; 
         break; 
        case 'HOURS': 
         loc.Hours = tokens[1]; 
         break; 
        case 'LOGO': 
         loc.LogoFileName = tokens[1]; 
         break; 
        case 'EMAIL': 
         loc.Email = tokens[1]; 
         break; 
       } 
      } 

      // save the destination 
      destinations[locIdx++] = loc; 
     } 

     if (destinations.length == 0) 
      document.getElementById('finding').innerText = 'An error occurred.'; 
     else 
      calculateDistances(origins, destinations); 
    } 

    function calculateDistances(orig, dest) { 
     // the passed-in destinations are arrays of Location objects; Google Maps wants strings 
     var destStrings = new Array(); 
     for (var i = 0; i < dest.length; ++i) 
      destStrings[i] = dest[i].ToAddressString(); 

     var service = new google.maps.DistanceMatrixService(); 
     service.getDistanceMatrix(
      { 
      origins: orig, 
      destinations: destStrings, 
      travelMode: google.maps.TravelMode.DRIVING, 
      unitSystem: google.maps.UnitSystem.IMPERIAL, 
      avoidHighways: false, 
      avoidTolls: false 
      }, onDistancesFound); 
    } 

    function onDistancesFound(response, status) 
    { 
     if (status != google.maps.DistanceMatrixStatus.OK) 
     { 
      alert('Error was: ' + status); 
     } 
     else 
     { 
      // get the place we'll store the list 
      var p = document.getElementById('finding'); 
      var table = document.getElementById('location-results'); 
      var orig = response.originAddresses; 
      var dest = response.destinationAddresses; 

      p.innerText = 'Tap a location for more options.'; 

      // iterate over origins 
      for (var i = 0; i < orig.length; ++i) { 
       var results = response.rows[i].elements;     
       // iterate over destinations 
       for (var j = 0; j < results.length; ++j) { 
        // split the location into the amount and units 
        var distance = results[j].distance.text.Trim().split(' '); 
        // update the locations 
        destinations[j].DistanceFromUser = parseFloat(distance[0]); 
        destinations[j].DistanceUnits = distance[1]; 
        destinations[j].TimeFromUser = results[j].duration.text; 
       } 
      } 

      // sort the distances 
      QuickSort(destinations, 'DistanceFromUser'); 

      // print the results 
      var tablerows = ''; 
      for (var i = 0; i < destinations.length; ++i) { 
       var loc = destinations[i]; 
       tablerows += RESULT_FORMAT.Format(loc.Name, loc.Phone, loc.ToAddressString(), loc.ToTwoLineAddressString(), 
        loc.Hours, loc.LogoFileName, loc.Email, i, 'location-result-' + ((i + 1) % 2 == 0 ? 'even' : 'odd'), 
        loc.DistanceFromUser, loc.StreetAddress, loc.City); 
      } 


      tablerows += '<tr><td><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/></td></tr>'; 

      // append the rows 
      table.innerHTML += tablerows; 
     } 
    } 

    function onLocationResultClick(name, phone, address, displayAddress, hours, imageUrl, email) 
    { 
     // save the name and address to local storage for the directions 
     window.localStorage.setItem('location-position', address); 
     window.localStorage.setItem('location-address', displayAddress); 
     window.localStorage.setItem('location-title', name); 
     window.localStorage.setItem('location-hours', hours); 
     window.localStorage.setItem('location-phone', phone); 
     window.localStorage.setItem('location-imageUrl', imageUrl); 
     window.localStorage.setItem('location-contact', email); 

     // call link 
     window.location = 'location.html'; 
    } 
</script> 
</head> 
<body onload="onLoad()"> 
    <h1> 
     <a href="index.html" class="back"> 
      <div> 
       <span></span> 
      </div> <span class="text">Back</span> 
     </a> Nearest Locations 
    </h1> 
    <div id="location-results-wrapper"> 
     <h1 style="position: static; width: 94%;"> 
      <a href="#" class="back"> 
       <div> 
        <span></span> 
       </div> <span class="text">Back</span> 
      </a> # 
     </h1> 
     <table id="location-results"> 
      <tr> 
       <td id="finding" style="vertical-align: top;">Finding your 
        location...</td> 
      <tr> 
     </table> 
    </div> 
</body> 
</html> 

以及確切的錯誤日誌:

06-27 09:06:00.624: E/Web Console(15020): Uncaught ReferenceError: google is not defined at file:///android_asset/www/locations.html:41

+0

當我檢查了您提供的[link](https://developers.google.com/maps/maps/documentation/javascript/examples/map-simple)的HTML源代碼。我發現它有''此腳本標記。但你的'

0

嘗試這些

  • 檢查互聯網連接
  • 保持地圖API腳本標記,在代碼中的第一個腳本標籤。 即在加載任何其他javascripts加載映射API之前。

希望這會有所幫助。

+0

可悲的是,沒有運氣,雖然你的想法,它運行谷歌太晚了,我沒有添加這個腳本試圖讓它等待谷歌,但我仍然沒有運氣:'函數LoadGoogle(){if(typeof谷歌!='undefined'&& google && google.load){//在這裏使用google.load()} else {//重試setTimeout(LoadGoogle,30); }}加載谷歌();'還有一點奇怪的是,當我使用老版本的PhoneGap時,我最初在(2.5)中編寫了原始文章中的確切代碼。 –

0

當你使用多個HTML頁面。在主頁(索引)上使用google API javascript。 Ajax在刷新時不會重新映射地圖。

0

如果谷歌地圖API未定義,那麼它也可能導致問題。 因爲我錯過了從經緯度獲取地址。

相關問題