1

なぜこれがうまくいかないのか誰か教えてもらえますか

Drupal.behaviors.toggleGroups = {
  attach:function(context, settings) {
    for (var i = 1; i < 8; i++) {
      $('#edit-group-' + i.toString() + '-toggle').unbind('click').click(function(i) {
        $('#category-' + i.toString()).slideToggle();
      });
    }
  }
};

しかし、この醜いものはうまく機能します

Drupal.behaviors.toggleGroups = {
  attach:function(context, settings) {
    $('#edit-group-1-toggle').unbind('click').click(function() {
      $('#category-1').slideToggle();
    });
    $('#edit-group-2-toggle').unbind('click').click(function() {
      $('#category-2').slideToggle();
    });
    $('#edit-group-3-toggle').unbind('click').click(function() {
      $('#category-3').slideToggle();
    });
    $('#edit-group-4-toggle').unbind('click').click(function() {
      $('#category-4').slideToggle();
    });
    $('#edit-group-5-toggle').unbind('click').click(function() {
      $('#category-5').slideToggle();
    });
    $('#edit-group-6-toggle').unbind('click').click(function() {
      $('#category-6').slideToggle();
    });
    $('#edit-group-7-toggle').unbind('click').click(function() {
      $('#category-7').slideToggle();
    });
  }
};

理想的には、「セレクターが結果を返している間、何かを実行する」のようなことをしたいと思います。問題は、増分された数値が必要であり、クリックするたびに個別のdivが切り替わるということです。私はそれをすべて間違って考えている可能性がありますが、それにもかかわらず、私が持っているものがなぜ有効でないのか理解できません...

そして、あなたがそれをしている間、クリックハンドラーをアンバインド/バインドする必要がないように、jQueryのonce()メソッドに関するアドバイスもありがたいです...

ありがとう!

4

2 に答える 2

3

古典的な閉鎖の問題。

これを試して

Drupal.behaviors.toggleGroups = {
  attach:function(context, settings) {
    for (var i = 1; i < 8; i++) {
      (function(num){
         $('#edit-group-' + num + '-toggle')
                                    .unbind('click').click(function(num) {
            $('#category-' + num).slideToggle();
         });
      })(i)
    }
  }
};

関数が割り当てられるまでに、変数iは同じメモリ位置を共有します。したがって、常にiの最後のインスタンスを指します

于 2012-12-13T23:21:18.220 に答える
2

これは「イディティス」の一般的なケースです。2つの一般的なクラスを使用すると、すべての操作がはるかに簡単になります。IDを削除してクラスを追加するedit-group-togglecategory、対応するターゲットをインデックスで取得できます。

attach: function( context, settings ) {
  $('.edit-group-toggle').click(function() {
    $('.category').eq( $(this).index() ).slideToggle();
  });
}
于 2012-12-13T23:31:44.093 に答える