javascript - 将 setTimeout 与递归函数一起使用
问题描述
我正在尝试制作幻灯片。我偷看了一些片段,然后尝试在不直接复制的情况下重新创建它们。这是片段:
var slideIndex = 0;
showSlides();
function showSlides() {
var i;
var slides = document.getElementsByClassName("mySlides");
for (i = 0; i < slides.length; i++) {
slides[i].style.display = "none";
}
slideIndex++;
if (slideIndex > slides.length) {slideIndex = 1}
slides[slideIndex-1].style.display = "block";
setTimeout(showSlides, 2000); // Change image every 2 seconds
}
好吧,我不明白当函数只被调用一次时 setTimeout 是如何工作的,为什么不在函数外使用 setInterval 。非常感谢。
解决方案
最后一件事showSlides
是设置一个超时,以便在 2 秒后再次调用自己。该调用完成后,它会设置另一个超时。这将永远持续下去。
在这种情况下,如果您使用setInterval
. 两者都会完成同样的事情。setInterval
不过取消会更容易,这是一个优势。
如果您确实使用,请务必删除对setTimeout
in的调用:showSlides
setInterval
var slideIndex = 0;
function showSlides() {
var i;
var slides = document.getElementsByClassName("mySlides");
for (i = 0; i < slides.length; i++) {
slides[i].style.display = "none";
}
slideIndex++;
if (slideIndex > slides.length) {slideIndex = 1}
slides[slideIndex-1].style.display = "block";
}
setInterval(showSlides, 2000);
要取消间隔,请捕获返回的 IDsetInterval
并调用clearTimeout
:
let id = setInterval(showSlides, 2000);
clearTimeout(id); // This will clear and cancel the setInterval
推荐阅读
- html - 如何在 div 中制作一半文本,在 CSS 中制作另一半文本?
- java - Tomcat HTTP Base 身份验证和 JAX-WS:客户端生成失败
- javascript - 使用 Jest & Enzyme 在 React 中测试父组件的道具功能
- c# - 如何在 ASP.NET CORE 3.0 中配置路由以使用带有 [FromQuery] 参数的重载 [HttpGet] 方法?
- ssis - SSIS - 如何使用执行 SQL 任务的结果来调用 Web 服务
- python - 当我在盒子上按 onclick() 时出现硒问题
- snowflake-cloud-data-platform - 如何应对大数据文件格式和外部表中区分大小写的列名?
- javascript - 通过检查 Span 文本将 CSS 类添加到 Div
- c# - 如何在类库中获取字符串资源
- laravel - 类中的 Laravel 责任