0

私はそれを機能させるのにかなり近づいていると思いますが、コードの何が問題なのかまだわかりません。サイズに応じて、一連の 13 または 15 の異なるイメージを介してランダムにイメージ src をスワップする関数を際限なく実行する必要があります。この関数は機能していますが、一度だけ、「再帰的すぎる」ブラウザエラーが発生することなく、計画どおりに無限に実行されていません. コードは次のとおりです。

function SwitchImageLoop(image, imageSize){
    if(imageSize == '110x110'){var randomNumber = Math.floor(Math.random()*15) + 1};
    if(imageSize == '247x110'){var randomNumber = Math.floor(Math.random()*13) + 1};
    image = document.getElementById(image);
    var randomTimer = Math.floor(Math.random() * 3000) + 1000;
    FadeImages(image, imageSize, randomNumber);
    var endlessLoop = setTimeout(function(){SwitchImageLoop(image, imageSize)}, randomTimer);
}

function FadeImages(image, imageSize, randomNumber){
    $(image).fadeOut(300, function(){
        $(image).attr('src', '/halcyonic/images/collage_'  + imageSize + '_' + randomNumber + '.jpg').bind('onreadystatechange load', function(){
            if(image.complete) $(image).fadeIn(300);
        });
    });
}
4

3 に答える 3

3

問題は、 setTimeout 関数内で SwitchImageLoop を呼び出している場合です。SwitchImageLoop は最初のパラメーターを文字列 (id) として受け入れますが、次回 setTimeout 内で関数を呼び出すときは、ドキュメント オブジェクトを最初のパラメーターとして渡します。

function SwitchImageLoop(image, imageSize){
    if(imageSize == '110x110'){var randomNumber = Math.floor(Math.random()*15) + 1};
    if(imageSize == '247x110'){var randomNumber = Math.floor(Math.random()*13) + 1};

次の呼び出し document.getElementById(documentObject) でエラーが発生します

    image = document.getElementById(image);
    var randomTimer = Math.floor(Math.random() * 3000) + 1000;
    FadeImages(image, imageSize, randomNumber);
    var endlessLoop = setTimeout(function(){SwitchImageLoop(image, imageSize)}, randomTimer);
}

関数を次のように書き換えます

    function SwitchImageLoop(image, imageSize){
        if(imageSize == '110x110'){var randomNumber = Math.floor(Math.random()*15) + 1};
        if(imageSize == '247x110'){var randomNumber = Math.floor(Math.random()*13) + 1};
         var randomTimer = Math.floor(Math.random() * 3000) + 1000;
        FadeImages(image, imageSize, randomNumber);
        var endlessLoop = setTimeout(function(){SwitchImageLoop(image, imageSize)}, randomTimer);
    }

    function FadeImages(image, imageSize, randomNumber){
       image=document.getElementById(image);    
       $(image).fadeOut(300, function(){
            $(image).attr('src', '/halcyonic/images/collage_'  + imageSize + '_' + randomNumber + '.jpg').bind('onreadystatechange load', function(){
                if(image.complete) $(image).fadeIn(300);
            });
        });
    }
于 2013-06-04T02:16:57.283 に答える
0

「再帰的すぎる」というエラーについて考えてください。

あなたの関数は自分自身を呼び出しています。自分自身を呼び出すたびに、少し多くのメモリを使用します。コンピューターがクラッシュしないように、再帰の深さには上限があります。無限ループの再帰ではなく、while ループを使用したい場合があります。

http://www.w3schools.com/js/js_loop_while.asp

于 2013-06-04T02:14:58.480 に答える