好的,这是一个主要的编辑。我想我可以通过给出一个类似的简单代码的例子来达到目的,但它没有帮助。
我有一个显示Google地图的工作功能,然后放置带有信息窗口的标记。一切正常。然后我决定稍微延迟标记的丢弃,而不是一下子全部丢弃,它们会暂停xx毫秒而下降。我无法让这个工作,我的困惑的主要原因是我似乎对for循环在JavaScript中的工作方式感到困惑。
我正在使用setTimeout,无法使其正常工作,意识到我的混乱与setTimeout无关,所以我将其拉出来并用警报替换它,我得到了同样的行为。我不是在找人写我的代码,我只是不明白我在这里缺少的东西。
我希望for循环是这种行为......
有关 做一点事 做点别的 做另一件事 下
看来我看到的是这种行为......
有关 做一点事 做其他事情(并通过代码为每个循环做) 做另一件事 下
所以这是代码:
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函数(它现在只有一个警报),然后添加监听器。我仍然可以立刻获得所有标记。我会提前道歉我知道这是我已经感到愚蠢的事情,但我只是没有看到问题。
非常感谢任何帮助。
答案 0 :(得分: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);
我在您的代码中使用console.log
而非document.write
的原因是因为document.write
应该仅在页面使用时被渲染,而不是之后。幸运的是,在你的情况下也是如此。不幸的是,setTimeout
否定了这一点。
使用setTimeout
表示您为第一个参数提供的代码将在X毫秒后以异步执行。到那时,如果您正确使用setTimeout
,您的页面将被渲染,您将覆盖该文档。就像我说的那样,因为setTimeout
是异步的,所以实际上不会阻止/暂停/停止Javascript处理。我认为这是你困惑的根源。你希望它“延迟”2秒,但如果你真的想这样做,你会冻结浏览器2秒钟。 setTimeout
允许您在不冻结浏览器的情况下执行此操作。但你不能以你想象的正常方式使用它...这就是为什么我上面的代码不是正常的for
循环。