Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我的设置超时不';我不能正常工作_Javascript_Jquery_Loops_Settimeout - Fatal编程技术网

Javascript 我的设置超时不';我不能正常工作

Javascript 我的设置超时不';我不能正常工作,javascript,jquery,loops,settimeout,Javascript,Jquery,Loops,Settimeout,代码如下: var stripeAnimation = function() { var streetDivWidth = $('.street_name').width(); var streetFull = $('.street_name .street_name_text'); for(var i=0; i<streetFull.length; i++) { var item = $(streetFull[i]); var widthFull = item.wid

代码如下:

var stripeAnimation = function() {

var streetDivWidth = $('.street_name').width();
var streetFull = $('.street_name .street_name_text');

for(var i=0; i<streetFull.length; i++) {
    var item = $(streetFull[i]);
    var widthFull = item.width();
    var remainder = widthFull - streetDivWidth;
    var animationSpeed = widthFull * 5;
    var summary = streetDivWidth - widthFull;
    if(summary < 0) {
        item.children('.gradient_span').addClass('gradient');
        infinite();
        setTimeout(infinite, 1000);
    }

}
function infinite() {
    item.animate({
        marginLeft: '-' + remainder + 'px'
    }, animationSpeed).animate({
            marginLeft: 0
        }, widthFull).delay(1000);
}

}
$(document).ready(function() {
    stripeAnimation();
});
var stripeAnimation=function(){
var streetDivWidth=$('.street_name').width();
var streetFull=$('.street_name.street_name_text');

对于(var i=0;i如果要循环,则需要使用setInterval()

然后


余数变量是局部变量,u将其用作全局函数。应全局声明它。

setTimeout
将只调用函数一次,但正如Arun p所说,您可以选择使用
setInterval
,只是不建议将其用于动画。setInterval的问题是您指定的延迟间隔fy是调用它之前的最短时间,但不是在该间隔结束时调用它的承诺

例如,如果设置了300毫秒的间隔,但队列被其他操作(UI或其他JS操作)阻塞比如说,600毫秒后,你的函数将被调用两次,一次又一次,没有延迟,这将使你的动画不均匀。你不能确保超时将被精确地调用,只是不小于这个间隔

更好的方法是使用setTimeout进行第一次初始调用,正如您所做的那样,然后在
infinite()
函数调用
setTimeout(infinite,1000)
结束时再次调用

综上所述,如果适用的话,制作动画的最佳方法是requestAnimationFrame方法,您可以在这里查看:


我会避免在动画中使用setInterval,因为它可能会导致动画不均匀。在这里,我不知道为什么它只适用于最后一个span块。((嗨!谢谢。但是我改变了方法,它仍然以相同的方式工作:它会循环,你说的“仍然以相同的方式工作”是什么意思?)?什么不对?看起来不错,我看到你使用了requestAnimationFrame,也在无限函数中调用了它。因为这是我建议的,如果你能接受我的答案作为这个问题的正确答案并投赞成票,我将不胜感激!但是很抱歉,我不能投你的赞成票,因为我的声誉很低。我会的嗯,我拿到了一些。
setInterval(infinite, 10000);
function infinite() {
    item.animate({
        marginLeft: '-' + remainder + 'px'
    }, animationSpeed).animate({
            marginLeft: 0
        }, widthFull);
}