setTimeout似乎没有调用该函数

时间:2012-07-27 22:57:33

标签: javascript settimeout

代码工作得很好,直到我添加了setTimeout。现在,无论我如何尝试调用setTimeout(setTimeout(function(){fadeOut()},1000); setTimeout("fadeOut()",1000);等中的函数),它似乎都没有进入函数。

我是一个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;
    }
}

2 个答案:

答案 0 :(得分:3)

您无法使用此结构:

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

因为setTimeout()中的代码在某个时间运行,所以你的完成值永远不会改变,这个循环将永远运行。并且,只要它运行,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;
    }
}

答案 1 :(得分:0)

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