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 を 1 回呼び出すだけで、関数が返されます。そして、それが起こるのを待つという考えを忘れてください。

于 2012-07-27T23:12:43.873 に答える