Android PhoneGap上的Javascript错误“未捕获参考错误:谷歌未定义”

时间:2013-06-26 20:30:56

标签: android cordova

我最近更新了我最近使用的PhoneGap / Cordova版本。我的应用程序中有一个页面,每次加载时都会抛出以下错误。

  

未捕获参考错误:Google未定义

我尝试直接从google开发人员网站上使用示例网页尝试缩小我的选项,但在尝试在手机上加载该页面时仍然遇到同样的错误。 (见https://developers.google.com/maps/documentation/javascript/examples/map-simple)。我应该注意,当我在谷歌桌面上将谷歌作为.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):未捕获的ReferenceError:google未定义在file:///android_asset/www/locations.html:41

4 个答案:

答案 0 :(得分:0)

试试这些

  • 检查您的互联网连接
  • 将Map API脚本标记保留为代码中的第一个脚本标记。 即在加载任何其他javascripts加载地图API之前。

希望这有帮助。

答案 1 :(得分:0)

我找到了解决方案。运行PhoneGap的更新命令时,cordova.js和config.xml文件未复制到我的项目中。我不确定这是否是故意的(我很容易错过这方面的文件),但当时似乎不直观。手动将这两个文件复制到我的项目后,一切正常。

答案 2 :(得分:0)

当您使用多个HTML页面时。在主页(索引)上使用google API javascript。当刷新时,Ajax不会重新映射地图。

答案 3 :(得分:0)

如果没有定义google map api,那么它也会导致问题。 因为我从纬度和经度获取地址时错过了。