2

0.5秒ごとに10回の反復で画像を変更する関数を作成しようとしています。最後の反復で、画像srcは実際の値に設定されます。これは最初のループで機能しますが、最初に起動すると、文字列ではなくオブジェクトsetTimeoutを渡します。Firebugを使用していますが、コンソールに次のように表示されます。 mo456

ここに画像の説明を入力してください

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script>
function loopMoHolder(lmc,thisMoDivID){
    ++lmc;
    ffRan = parseInt(Math.floor((Math.random()*10)+1));
    console.log(lmc);
    console.log(thisMoDivID);
    $('#'+thisMoDivID+' .moHolder .ffbg img').attr('src','/img/moMoniker/mo'+ffRan+'.png');

    if (lmc <= 10) {
        setTimeout("loopMoHolder("+lmc+","+thisMoDivID+")" , 500); }
    else {
        $('#'+thisMoDivID+' .moHolder .ffbg img').attr('src','/img/moMoniker/mo10.png');
    }
    }
</script>

これはhtmlです

<div class="moHolder">
    <div id='mo456' class="moCol ffbg"><img src="/img/moMoniker/mo1.png"></div>
</div>

問題はsetTimeout行であると確信していますが、修正方法がわかりません。

4

3 に答える 3

4

..の実行される関数の引数として文字列を使用しないでください。関数setIntervalでなければなりません (無名かどうかに関係なく)。実際、これが問題です。あなたがしたことは、次の呼び出しに相当します。

loopMoHolder(valueOfLmc, valueOfThisMoDivId)

...(明らかに)に補間します

loopMoHolder(9, #[object HTMLDivElement])

...これは構文的に正しくありません。

代わりに、おそらく呼び出したい

loopMoHolder(lmc, thisMoDivID)

...他の 2 つの変数は存在しないか、正しく機能しない可能性があり、無効な構文を引き起こす可能性さえあります。

setTimeout(function () {
    loopMoHolder(lmc, thisMoDivID)
}, 5000);

またsetInterval、メソッド自体で後続の呼び出しを行う必要がないように、より適切なように思えます。

于 2013-02-26T23:53:05.970 に答える
2

特にオブジェクトを渡す場合は、文字列引数で setTimeout を使用しないでください。私はあなたのコードの一部を自由に書き直しました。

function loopMoHolder(lmc, thisMoDivID){
    var ffRan   = Math.floor(Math.random() * 10 + 1),
        $el     = $('#' + thisMoDivID + ' .moHolder .ffbg img');

    $el.attr('src', '/img/moMoniker/mo' + ffRan + '.png');

    if (lmc <= 10) {
        setTimeout(function() {
            loopMoHolder(lmc + 1, thisMoDivID);
        }, 500);
    } else {
        $el.attr('src', '/img/moMoniker/mo10.png');
    }
}
于 2013-02-26T23:55:42.890 に答える
0
var intervalId, intervalCount = 0,
    img = $('#mo456 .moHolder .ffbg img')[0],
    loopMoHolder = function(){
        var rand = parseInt(Math.floor((Math.random()*10)+1));
        if (++intervalCount < 10) {
            img.src = '/img/moMoniker/mo'+ rand +'.png';
        } else {
            img.src = '/img/moMoniker/mo10.png';
            window.clearInterval(intervalId);
        }
     };

intervalId = window.setInterval(loopMoHolder, 500);
于 2013-02-27T00:04:00.860 に答える