gpt4 book ai didi

javascript - javascript for 循环中的所有 setTimeouts 一次发生

转载 作者:行者123 更新时间:2023-11-30 13:11:21 25 4
gpt4 key购买 nike

此函数应从页面顶部向下滚动到下方 215 像素,并增加延迟,以便第一个 window.scrollTo 事件发生在 10 毫秒,下一个事件发生在 20 毫秒,依此类推。
最后一行应该延迟 2150 毫秒,所以总共需要大约 2 秒。
相反,它会立即同时向下滚动 215 个像素。

function scrollDown() {
var yFinal=216, delay=0;
for (y=0; y<yFinal; y++) {
delay = delay+10
setTimeout(function() {
window.scrollTo(100,y);
},delay);
}
}

悲伤的脸。为什么?

[编辑:感谢您的帮助!我用它来编写这个有点复杂的最终解决方案,我在这里提供它供任何人窃取。它首先快速滚动,然后慢速滚动。正是我想要的。通过使用 setTimeout insteat of setInterval,它可以让您更好地控制速度曲线,因此您可以轻松地使其以指数方式减速]

function showCategory(categoryId)
{
var yInitial=document.body.scrollTop,
yFinal=216,
delay=0;

if (yInitial<yFinal)
{
yInitial=(yFinal-yInitial)/1.3+yInitial;
window.scrollTo(100, yInitial);

for (var yCurrent = yInitial; yCurrent < yFinal; yCurrent+=2)
{
delay += 30;
(function(position)
{
setTimeout(function()
{
window.scrollTo(100, position);
}, delay);
})(yCurrent);
}
}
}

最佳答案

超时不会全部发生,它们会在您期望的时间发生。但是,它们都尝试滚动到由相同的 y 变量表示的位置,因此它们都使用循环结束时 y 的任何值。

通常的解决方法是引入闭包:

function scrollDown() {
var yFinal = 216,
delay = 0;

for (var y = 0; y < yFinal; y++) {
delay += 10;
(function(position) {
setTimeout(function() {
window.scrollTo(100, position);
}, delay);
})(y);
}
}​

(另请注意,您的 y 变量是全局变量:您应该使用 var 声明它以使其成为本地变量。)

关于javascript - javascript for 循环中的所有 setTimeouts 一次发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13774004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com