0

好的,这是一个主要的编辑。我想我可以通过给出一个类似的简单代码的例子来实现,但这并没有帮助。

我有一个显示谷歌地图的工作功能,然后用信息窗口放置标记。这一切都很好。然后我决定我想稍微延迟标记的丢弃,而不是一次全部丢弃,它们会暂停 xx 毫秒,然后再丢弃下一个。我无法让它工作,我困惑的主要原因是我似乎对 for 循环在 JavaScript 中的工作方式感到困惑。

我正在使用 setTimeout,无法使其正常工作,意识到我的困惑与 setTimeout 无关,所以我将其拉出并用警报替换它,我得到了相同的行为。我不是在找人来写我的代码,我只是不明白我在这里缺少什么。

我希望在 for 循环中是这种行为......

For do something do something else do another thing next

我所看到的似乎我得到了这种行为......

对于做某事做其他事情(并通过代码为每个循环做)接下来做另一件事

所以这里是代码:

    function delaydropmarkers()
    {
        alert("delaydropmarkers");
    }

    function marker(location) 
    {

        geocoder = new google.maps.Geocoder();
        var latlng = new google.maps.LatLng(37.5, -98.35);
        var mapOptions = 
        {
            zoom: 5,
            center: latlng,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        }

        map = new google.maps.Map(document.getElementById('googleMap'), mapOptions);

        var infowindow = new google.maps.InfoWindow(), marker, i;

        for (i = 0; i < location.length; i++) 
        {

            marker = new google.maps.Marker(
            {
                position: new google.maps.LatLng(location[i][1], location[i][2]),
                animation: google.maps.Animation.DROP,
                map: map
            }
            );

            delaydropmarkers();

            google.maps.event.addListener(marker, 'click', (function (marker, i) 
            {
                return function () 
                {
                    infowindow.setContent(location[i][0]);
                    infowindow.open(map, marker);
                }
            }
            )(marker, i));

        }

    }

所以我调用了应该创建一个标记的标记函数,转到 delaydropmarkers 函数(它现在只有一个警报),然后添加监听器。我让所有标记都同时运行。我会提前道歉我知道这是我已经感到愚蠢的事情,但我只是没有看到问题。

任何帮助是极大的赞赏。

4

1 回答 1

1

第一个错误是使用 W3Schools。http://ryanblunden.com/please-dont-use-w3schools

使其成为您可以在需要时递归调用的自己的函数:

function showCars(cars, index) {
    index = index || 0;
    if (index < cars.length) {
        console.log(cars[index]);
        setTimeout(function () {
            showCars(cars, ++index);
        }, 2000);
    }
}

var my_cars = ["BMW", "Volvo", "Saab", "Ford"];
showCars(my_cars);

http://jsfiddle.net/UcWTH/4/

我使用console.log而不是document.write您在代码中使用它的原因是因为document.write应该在呈现页面时使用,而不是之后。幸运的是,在你的情况下确实如此。不幸的是,setTimeout否定了这一点。

UsingsetTimeout意味着您为第一个参数提供的代码将在 X 毫秒后异步执行。到那时,如果您使用setTimeout得当,您的页面将被渲染,您将覆盖文档。所以就像我说的,因为setTimeout是异步的,它实际上并没有阻止/暂停/停止 Javascript 处理。我认为这是你困惑的根源。您希望它“延迟” 2 秒,但如果您真的想这样做,您会将浏览器冻结 2 秒。setTimeout让您在不冻结浏览器的情况下执行此操作。但是您不能以您认为的正常方式使用它……这就是为什么我上面的代码不是正常for循环的原因。

于 2013-01-24T21:35:52.190 回答