2013-02-26 38 views
2

我想写一个函数来改变图像每半秒10次迭代。在最后一次迭代中,图像src将被设置为实际值。这适用于第一循环,但第一次setTimeout触发它传递对象mo456而不是。我使用Firebug控制台显示:试图通过一个选择器,但第二次通过对象传递

enter image description here

<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的线,但我不能确定如何纠正它。

+0

你想要的setInterval ......可是,你真的想为一个新的IMG SRC每半秒的请求?这可能会造成糟糕的用户体验。 – 2013-02-26 23:45:37

+0

你第一次打电话给'loopMoHolder'? – 2013-02-26 23:47:26

+3

请不要将setTimeout和setInterval与字符串参数一起使用。总是传递一个函数。这就是我想说的。 – kapa 2013-02-26 23:47:40

回答

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'); 
    } 
} 
4

你不应该使用一个字符串作为setInterval执行函数的参数..它应该是一个函数(匿名或不是)。事实上,这是问题所在。你做了什么达呼吁:

loopMoHolder(valueOfLmc, valueOfThisMoDivId) 

...这插值到(显然)

loopMoHolder(9, #[object HTMLDivElement]) 

...这是语法不正确。

相反,你可能想打电话

loopMoHolder(lmc, thisMoDivID) 

...其他两个变量可能根本不存在或正常工作,甚至会导致无效的语法。

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

它还听起来像这样你就不必做的方法本身后续调用setInterval可能更合适。

+1

我希望我可以给第一句 – Eevee 2013-02-26 23:54:27

+0

+1千上传+1我希望每个人都忘记了这些函数可以用字符串参数调用。 – kapa 2013-02-27 00:08:25

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);