0

画像をスライドする機能があり、それを10個の小さなdivに分割し、各divには画像の一部があり、この関数を使用します:

  function change()
{
    $(document).ready(function(){
        for(var i=1,t=0,s="";i<=10;i++)
        {
        s= "#img2_" + i;
        setTimeout(function(){$(s).slideDown(2000)},t);
        t= t+300;
        }
    });
}

i=10 の div のみが slideDown であるという問題があります。i の最大値を変更しようとしましたが、その i を持つ div のみが slideDown です。だから私の問題は何ですか:(

4

1 に答える 1

1

タイムアウトが実行されるまでに、「s」はループの最後に割り当てられた値と等しくなります。これは、setTimeout に渡された関数が s への独自の参照を持たず、「グローバル」参照を使用しているためです。これを修正するには、次のように setTimeout の呼び出しの周りにクロージャーを作成します。

function change() {
  $(document).ready(function(){
    for(var i=1,t=0,s="";i<=10;i++) {
      s= "#img2_" + i;
      (function(img, delay){
        setTimeout(function(){$(img).slideDown(2000)}, delay);
      })(s, t);
      t= t+300;
    }
  });
}
于 2013-02-18T05:33:10.953 に答える