1

これは機能します:

  var toggler = function(most){
    var open = $('#toggle_' + most + ' .minus').is(':visible');

    if(open){
      $('#toggle_' + most + ' .minus').hide();
      $('#toggle_' + most + ' .plus').show();
    }else{
      $('#toggle_' + most + ' .plus').hide();
      $('#toggle_' + most + ' .minus').show();
    }

    $('#' + most + ' ol.tlist').toggle(open);
  };

  $('#toggle_mostviewed').click(function(){ toggler('mostviewed'); });
  $('#toggle_mostshared').click(function(){ toggler('mostshared'); });
  $('#toggle_mostrecent').click(function(){ toggler('mostrecent'); });

しかし、これはしません:

  var toggler = function(most){
    var open = $('#toggle_' + most + ' .minus').is(':visible');

    if(open){
      $('#toggle_' + most + ' .minus').hide();
      $('#toggle_' + most + ' .plus').show();
    }else{
      $('#toggle_' + most + ' .plus').hide();
      $('#toggle_' + most + ' .minus').show();
    }

    $('#' + most + ' ol.tlist').toggle(open);
  };

  var t = ['mostviewed','mostshared','mostrecent'];
  for(var i = 0 ; i  < t.length; i++ ){
    var j = t[i];
    $('#toggle_' + j).click(function(){ toggler(j) });
  }

for ループが次のように「置き換え」られたようなものです。

  $('#toggle_mostrecent').click(function(){ toggler('mostrecent'); });

つまり、最後の繰り返しだけが重要です。

4

4 に答える 4

2

ループが正しく構成されていません。配列またはオブジェクトの要素にアクセスするためにループ内で変数を設定する場合、これは正しい構文です。

var test = [];
for(var i = 0; i < test.length; test++)
    (function(index){
        // do cool stuff with test[index]
    })(i);

これにより、変数 i のクロージャが作成されます。構文に慣れていない場合は、次のようになります。

1) クロージャーを定義します ( for ステートメントの後の開始 () )

2) インデックス パラメータを受け取る無名関数を定義します。

3) () の最後のセットを使用して、インデックスをクロージャに渡します (つまり、関数を実行します)。

これらの 3 つのステップは、ループの反復ごとに発生します。クロージャーを使用してインデックス値をキャプチャしない場合、配列アクセスが実際に行われると、この例のインデックスは +1 になりすぎて、実行時にエラーが発生します。

乾杯

于 2013-11-09T02:27:29.227 に答える
0

ループ内でのクロージャ変数の誤った使用が原因です

この場合、配列を繰り返し処理しているため、$.each()を使用できます

var t = ['mostviewed','mostshared','mostrecent'];
$.each(t, function(_,most){
    $('#toggle_' + most).click(function(){ toggler(most) });
})
于 2013-11-09T02:19:41.563 に答える
0

あなたが言った:

$('#toggle_' + most).click(function(){ toggler(most) });

しかし、これはあなたが意味したことだと思います:

$('#toggle_' + j).click(function(){ toggler(j) });

(定義jしたが、代わりに使用mostした)。

于 2013-11-09T02:21:15.727 に答える
0

次のようなことをしてみませんか:

$('#toggle_mostviewed, #toggle_mostshared, #toggle_mostrecent').click(function({
    toggler((this.id).split("_").pop()); 
}); 

または、さらに良いことに、クラス「トグル」を指定して (さらに、ID を html に残します)、次のようにします。

$('.toggle').click(function({
    toggler((this.id).split("_").pop()); 
});
于 2013-11-09T02:23:22.077 に答える