0

所以这应该是一个非常简单的循环,但它对我不起作用。

    for(var j = 1, len = $('#account .person').length; j <= len; j++) {

    $('#a' + j).click( function(){ 
        $('#account' + j).css({left:'0%'});
    });

    };

我希望这会吐出来......

  $('#a1').click( function(){
      $('#account1').css({left:'0%'});
  });
 $('#a2').click( function(){
      $('#account2').css({left:'0%'});
  });
/* (etc......)  */
4

3 回答 3

1

中的函数

$('#a' + j).click( function(){ 
    $('#account' + j).css({left:'0%'});
});

创建一个闭包。简而言之,即使在块完成后,js 解释器也会使局部变量保持活动状态,但它不会复制它。因此,当点击事件发生时,该for已经完成,并且jleft 的值与最后一次迭代一样。

为了避免这种情况,请根据j您拥有的内容确定函数中的 ,即您要附加处理程序的元素,如下所示(警告:未测试):

 $('#a' + j).click( function(){ 
    var correct_j = $(this).attr('id').replace('a','');
    $('#account' + correct_j ).css({left:'0%'});
 });
于 2013-06-25T17:27:03.477 回答
1

如果您对每个元素进行相同的更改,并且每个#a__元素实际上都与.person类元素相同,那么您可以简单地执行以下操作:

$("#account .person").css({left: '0%' } );

无需循环。如果它们不相关,并且您需要循环,请.each()按照评论中的说明使用:

var j =1;
$("#account .person").each( function(){
    j++;
    $('#a' + j).data( 'num', j );
    $('#a' + j).click( function(){ 
        $('#account' + $(this).data('num') ).css({left:'0%'});
    });
});
于 2013-06-25T17:24:55.907 回答
0

有人将此添加为答案,然后出于某种原因将其删除,但它对我有用。

$('[id^="a"]').click( function(){
 $('#account'+this.id.match(/(\d+)$/)[0]).css({left:'0%'});
});

有什么理由我不应该使用这种方法吗?

于 2013-06-25T17:35:15.087 回答