0

在我添加 setTimeout 之前,代码运行良好。现在,无论我如何尝试调用 setTimeout ( setTimeout(function(){fadeOut()},1000); setTimeout("fadeOut()",1000);etc ) 中的函数,它似乎根本无法访问该函数。

我是一个 Javascript 新手,所以任何和所有的帮助都表示感谢 =]

javascript代码:

var slideArray = ["slide1","slide2","slide3","slide4","slide5","slide6"];
var currentSlide = null;
var current = null;
var done = false;

function fade(newSlide)
{
    if(currentSlide === null)
    {
        currentSlide = slideArray[0];
        document.getElementById(currentSlide).style.opacity = 1.0;

        for(var i=1;i<slideArray.length;i++)
            document.getElementById(slideArray[i]).style.opacity = 0.0;
    }

    current = document.getElementById(currentSlide);
    done = false;
    do
    {
        window.setTimeout(fadeOut,1000);
    } while(done == false);

    currentSlide = newSlide;
    current = document.getElementById(currentSlide);
    done = false;

    do
    {
        window.setTimeout(fadeIn,1000);
    } while(done == false);
}

function fadeOut()
{
    if(parseFloat(current.style.opacity)-0.1>.0000001)
    {
    current.style.opacity = parseFloat(current.style.opacity) -0.1;
        done = false;
    }
    else
    {
        current.style.opacity = 0.0;
        done = true;
    }
}

function fadeIn()
{
    if(0.9-parseFloat(current.style.opacity)>.0000001)
    {
        current.style.opacity = parseFloat(current.style.opacity)+0.1;
        done = false;
    }
    else
    {
        current.style.opacity = 1.0;
        done = true;
    }
}
4

2 回答 2

3

你不能使用这个结构:

do
{
    window.setTimeout(fadeIn,1000);
} while(done == false);

因为setTimeout()稍后运行的代码,你的 done 值永远不会改变,这个循环将永远运行。而且,只要它运行,setTimeout()也永远不会触发(因为 javascript 是单线程的)。

相反,如果你没有完成,你应该做的是setTimeout(fadeIn, 1000)从函数中启动下一个。fadeIn()

function fadeOut()
{
    if(parseFloat(current.style.opacity)-0.1>.0000001)
    {
        current.style.opacity = parseFloat(current.style.opacity) -0.1;
        setTimeout(fadeOut, 1000);
    }

    else
    {
        current.style.opacity = 0.0;
    }
}
于 2012-07-27T23:16:49.060 回答
0

请记住,javascript 是单线程的,因此在完成当前脚本运行之前不会调用您的 setTimeout'et 函数。这永远不会发生,因为您处于一个永远不会结束的循环中(直到您从所有这些 setTimeout 中耗尽内存)。只需调用一次 setTimeout 并让函数返回。忘记等待它发生的想法。

于 2012-07-27T23:12:43.873 回答