我有一张幻灯片,其中有4张图片有一个分页,现在我希望它们在循环中逐个显示,为了循环我有这个代码:
function myfn(interaltime) {
setTimeout('$("#picgallery_pagging li:eq(0)").trigger("click")', 0);
setTimeout('$("#picgallery_pagging li:eq(1)").trigger("click")', interaltime);
setTimeout('$("#picgallery_pagging li:eq(2)").trigger("click")', interaltime*2);
setTimeout('$("#picgallery_pagging li:eq(3)").trigger("click")', interaltime*3);
setTimeout('myfn('+interaltime+')',interaltime*4);
};
myfn(3000);
我的问题:它无法正常工作,只运行一次,第二轮内部时间变量为空
分页中的每个按钮运行我的自定义功能效果以显示图片,因为你看我必须在我的分页上的每个按钮上触发点击功能。(我不知道如何使用我自己的功能在jquery中使用延迟)
注意:我在控制台日志中检查了intervaltime变量,并且在seconde转弯时它是空的!但我不知道如何解决它! 编辑:我使用了setInterval但是第二次使用时intercaltime变量仍为空
答案 0 :(得分:2)
你将字符串传递给setTimeout
- 这不是最佳做法,而且可能完全不可靠。
试试这个,而不是:
function autoclick($el, delay) {
var i = 0, n = $el.length;
(function loop() {
$el.eq(i).trigger('click'); // do your thang
i = (i + 1) % n; // increment and reset (if required)
setTimeout(loop, delay); // loop "recursively"
})(); // invoke immediately
}
autoclick($('#picgallery_pagging li'), 1000);
它消除了代码中的重复,并安排为每个元素反复调用自己,而不是整个四个元素。
调用不是真正的递归,即使它看起来像它,因为它实际上是浏览器的事件循环,它负责一遍又一遍地调度函数调用。
演示答案 1 :(得分:0)
其中一个选项是这样的:
function myfn(interaltime) {
function wrapper(){
do_stuff();
setTimeout(wrapper, interaltime);
}
setTimeout(wrapper, 0);
}
您基本上将超时设置为一次又一次地运行相同的功能。这是非常简化的样本,甚至没有尝试提供取消循环的方法。此外,请注意,它不是任何方式的递归调用,因此您不会遇到堆栈溢出问题。
更简单的选择是使用setInterval:
function myfn(interaltime) {
return setInterval(do_stuff, intervaltime);
}
这样你就可以取消循环,比如
var loop = myfn(100);
//somewhere later
clearInterval(loop);
答案 2 :(得分:0)
尝试:
setTimeout(function() {
$("#picgallery_pagging li:eq(0)").trigger("click");
}, 0);
而不是
setTimeout('$("#picgallery_pagging li:eq(0)").trigger("click")', 0);
并重复所有其他setTimeouts。实质上,对setTimeout
使用匿名函数