【问题标题】:Google Map Api and JS code not workingGoogle Map Api 和 JS 代码不起作用
【发布时间】:2015-04-07 18:47:23
【问题描述】:

下面是我获取从 A 点到 B 点的距离(地址数组)的简单代码。问题在于“alert(end[i]+distanceKM);”,尤其是变量 distanceKM。

我认为我做得对。变量 distanceKM 在 for 循环之外声明,值在 for 循环中设置。我的警报在 for 循环内。

但我还是得到了

警报值:4700 Highway 280undefined 等等......

好像没有设置distanceKM,=未定义,我有:distanceKM=response.routes[0].legs[0].distance.value / 1000;

测试代码:

<html>
<head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
    <title>Distance Calculator</title>
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>

    <script type="text/javascript">
    var directionDisplay;
    var directionsService = new google.maps.DirectionsService();
    var map;

    function initialize() {
        directionsDisplay = new google.maps.DirectionsRenderer();
    }

    function calcRoute() {
        var start = document.getElementById("start").value;
        var end = document.getElementById("end").value.split('@@');
        var distanceKM;         
        for (i = 0; i < end.length; i++) 
        {
            var request = {
                origin:start, 
                destination:end[i],
                travelMode: google.maps.DirectionsTravelMode.DRIVING
            };

            directionsService.route(request, function(response, status) 
            {
                if (status == google.maps.DirectionsStatus.OK) 
                {
                    directionsDisplay.setDirections(response);
                    distanceKM=response.routes[0].legs[0].distance.value / 1000;
                }
            }); 
            alert(end[i]+distanceKM);   
        }

    }
    </script>
</head>
<body onload="initialize()">
    <div>
        <p>
            <label for="start">Start: </label>
            <input type="text" name="start" id="start" value="815010 NE 36th Steet, Redmond, WA, USA" />

            <label for="end">End: </label>
            <input type="text" name="end" id="end" value="4700 Highway 280, Birmingham, AL, USA@@6900 US Highway 90, Suite 2, Daphne, AL, USA@@549 Brookwood Village, Homewood, AL, USA@@4800 Whitesburg Dr., Huntsville, AL, USA" />

            <input type="submit" value="Calculate Route" onclick="calcRoute()" />
        </p>
        <p>
            <label for="distance">Distance (km): </label>
            <input type="text" name="distance" id="distance" readonly="true" />
        </p>
    </div>
</body>
</html>

【问题讨论】:

    标签: javascript google-maps scope


    【解决方案1】:

    路由请求不会同步返回结果,所以如果你尝试在请求外立即访问distanceKM,它仍然是未定义的。

    为了帮助您了解执行顺序,请查看编号的 cmets:

        // 1.) route request is sent, and the anonymous callback
        //     function is defined.
        directionsService.route(request, function(response, status) 
        {
            // 3.) Response from google is received and the anonymous 
            //     callback function is called.
            if (status == google.maps.DirectionsStatus.OK) 
            {
                directionsDisplay.setDirections(response);
                // 4.) distanceKM is set.
                distanceKM=response.routes[0].legs[0].distance.value / 1000;
            }
        });
        // 2.) Alert is shown
        alert(end[i]+distanceKM);  
    

    因此,为了让您的警报发挥作用,请将其放在 distanceKM=... / 1000; 之后。您还需要对 end[i] 进行特殊处理。例如

        directionsService.route(request, (function(destination){ 
            return function(response, status) {
                if (status == google.maps.DirectionsStatus.OK) {
                    directionsDisplay.setDirections(response);
                    distanceKM=response.routes[0].legs[0].distance.value / 1000;
                    alert(destination+distanceKM);
                }
            };
        })(request.destination)); 
    

    这使用Immediately-invoked function expression(IIFE) 模式。

    【讨论】:

    • 非常感谢执行命令!但我认为我们仍然缺少一些东西。警报给出的所有地址“4800 Whitesburg Dr., Huntsville, AL, USA”似乎是数组的最后一个值
    • 另外我注意到每次获取距离时它不会给出相同的结果,但我认为我传递了一个数组值 end[i],所以警报应该始终按顺序进行
    • 不管它是什么顺序,我其实都很好,但只要地址与距离匹配
    • 啊我明白了,会更新
    • 我实际上刚刚解决了它,似乎 google 目标变量不喜欢数组,所以我创建了一个带有参数地址的函数,因此 google api destionation 采用该单个地址,我只是循环通过该函数传递相应地址时的总 # 个地址。不过谢谢,如果没有您的帮助,就不会查看目标变量
    猜你喜欢
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多