使用setTimeOut在3秒后逐个显示标记.为什么它只显示最后一个标记
Display markers one by one after 3 seconds using setTimeOut.. Why it shows only the last marker?
我试图使用setTimeOut逐个显示标记,但它不起作用。下面是我的代码:
function showOneByOne(arrayOfMarkersObj) {
for (u in arrayOfMarkersObj) {
setTimeout(function() {
arrayOfMarkersObj[u].setVisible(true);
}, 3000);
}
}
问题是它只显示地图上的最后一个标记,而不是所有的标记。但是如果我把
arrayOfMarkersObj[u].setVisible(true);
setTimeOut之外,它显示所有标记。
为什么会这样?
将键存储到数组中(如果您仅使用支持ECMA5的浏览器,您可以按照注释中的建议使用Object.keys()代替:
var keys = [];
for (u in arrayOfMarkersObj)
keys.push(u); //assuming arrayOfMarkersObj is an object not an array?
现在在你的setTimeout
中一个接一个:
var current = 0;
function reveal() {
arrayOfMarkersObj[keys[current++]].setVisible(true);
if (current < keys.length) setTimeout(reveal, 3000);
}
reveal();
如果你想要第一个延迟的切换到最后一行:
setTimeout(reveal, 3000);
帖子中的示例不起作用的原因是因为u
在调用setTimeout
时不可用。事件setTimeout
设置调用的代码在window
对象上调用。
为了使var可用,您需要将其存储在"上一级",通常是全局作用域或包装函数内(通过that = this
作为this
变为window
的引用,然后在setTimeout
中使用that
)来访问它。
在JavaScript中,内部作用域中的变量的值与定义该变量的作用域绑定。这意味着当执行回调时,将从定义u
的作用域(即showOneByOne()
)中检索u
的值。因此,每次回调执行时,u
将等于arrayOfMarkersObj.length -1
(for
循环后的最终值)。
一个简单的解决方法应该是使用forEach,即使不清楚是否需要为每个元素使用不同的回调/计时器。您不妨按照Ken - Abdias Software的回答建议使用一个。
相关文章:
- 为什么不显示警报窗口
- 为什么缩放按钮不会显示在照片擦除中
- 对于Ajax调用,为什么innerHTML没有显示在IE中
- 为什么我的视图没有显示在角度ui视图中
- 为什么只有最后一项显示,而不是全部显示
- 为什么't标记显示在谷歌地图上
- 为什么数据不能't显示在查看页中
- 为什么竞争不能在离子中显示(隐藏在标题下方)(离子竞争不能正常工作)
- 为什么我的脚本正在运行动画,但没有显示它
- 为什么在React中,todo列表的显示如此脆弱
- 为什么视频不显示在有角度的灯箱中?图像有效,但视频无效;t
- 为什么不显示多个HTML对象对象
- 为什么jqPlot显示了一个错误的饼图,其中包含通过AJAX检索的数据
- 为什么“;未定义的“;以棱角分明的js显示
- 为什么浏览器为电子邮件验证正则表达式显示不同的反斜杠.如何防止这种情况发生
- 为什么我的Alexa技能测试显示正确的lambda输出,但在开发人员控制台中测试时却给出错误消息
- 为什么WebBrowser控件在保存后不能正确显示HTML
- 为什么不't Internet Explorer显示foreignObject
- Nivo滑块:滑块在最后一张幻灯片后消失,并在30秒左右后再次显示.为什么
- alert(parseInt(“09”));向我显示“0”为什么