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) 我们将索引传递给带有最后一组 () 的闭包(即我们执行函数)。

这三个步骤发生在循环的每次迭代中。如果不使用闭包来捕获索引值,那么当实际进行数组访问时,本例中的索引会+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 回答