jQuery 每行项目单击附加数据 html 在第 3 个项目之后

jQuery each row items click append data html after 3rd items

我有一个 html 代码,如下所示, 每个列表都有一个 class 和一个按钮, 因此,当用户单击按钮时,它应该使用 json 附加一个 html 并在第 3 个项目之后附加,详细信息代表项目详细信息,我曾尝试使用 nth-child,但它会使我的每个 3n+3 附加 html,我想要的是当用户单击 1、2、3 项时它将在第 3 项之后附加,当单击 4、5、6 项时,它将附加详细信息html 在 6 之后。 请忽略数据拉取。这是我使用的方式

$('.item').eq(i % 3).after(html_details);

这是我的 Html

<ul class="list">
    <li class="item">List 1</li>
    <li  class="item">List 2</li>
    <li  class="item">List 3</li>

    <!-- should append a html here -->

    <li  class="item">List 4</li>
    <li  class="item">List 5</li>
    <li  class="item">List 6</li>

    <!-- should append a html here -->

这是我的 jQuery

$('.item').each(function(i){

    $(this).find('a').on('click',function(){

      var html_details = detailsTemplate(data[i]);

        console.log(i)

        $('.Details').remove();

        $('.item').eq(i % 3).after(html_details);

        $('.Details').hide();
        $('.Details').slideToggle();

      return false;

    })

我该怎么做?

你的逻辑可以是这样的:

$('.item').eq(i + 3 - (i % 3) - 1).after(html_details);

这里有一些解释。 3 - (i % 3) 计算需要向前跳过多少项目。然后将此数字添加到当前索引 i 以获得要在其后附加内容的项目。我还添加了 - 1 以便能够使用 after 而不是 before,因此它也适用于最后一项。

查看下面的演示。

$('.item').each(function (i) {
    $(this).find('a').on('click', function () {
        var html_details = detailsTemplate(data[i]);
        console.log(i + 3 - (i % 3) - 1)        
        $('.Details').remove();
        $('.item').eq(i + 3 - (i % 3) - 1).after(html_details);
        $('.Details').hide();
        $('.Details').slideToggle();
        
        return false;
    });
});

var data = [0, 1, 2, 3, 4, 5, 6];
function detailsTemplate(d) {
    return '<div class="Details">' + (d + 1) + '</div>';
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="list">
    <li class="item">List 1 <a href="">link</a></li>
    <li class="item">List 2 <a href="">link</a></li>
    <li class="item">List 3 <a href="">link</a></li>
    <!-- should append a html here -->
    <li class="item">List 4 <a href="">link</a></li>
    <li class="item">List 5 <a href="">link</a></li>
    <li class="item">List 6 <a href="">link</a></li>
    <!-- should append a html here -->
</ul>

您可以使用 for 循环而不是 each 进行索引。你的情况

   for(var i=0;i<$('.item').length;i++)
    {
    $(this).find('a').on('click',function(){

          var html_details = detailsTemplate(data[i]);
                console.log(i)

            $('.Details').remove();
             if(i%3==0)
             {
                $('.item')[i].after(html_details);
              }
            $('.Details').hide();
            $('.Details').slideToggle();

        }

如果你使用 .each() 那么你必须在其中引入计数并检查计数值

您可以使用:

<ul class="list">
    <li class="item"><a href="javascript:void(0)">List 1</a></li>
    <li  class="item"><a href="javascript:void(0)">List 2</a></li>
    <li  class="item"><a href="javascript:void(0)">List 3</a></li>

    <!-- should append a html here -->

    <li  class="item"><a href="javascript:void(0)">List 4</a></li>
    <li  class="item"><a href="javascript:void(0)">List 5</a></li>
    <li  class="item"><a href="javascript:void(0)">List 6</a></li>
</ul>

和:

$('.item').each(function(i) {
    $(this).find('a').on('click',function() {
        var html_details = '<li class="Details">DETAILS</li>'; //detailsTemplate(data[i]);

        $('.Details').remove();

        var index = (Math.floor(i / 3) * 3) + 2;

        $('.item').eq(index).after(html_details);

        $('.Details').hide();
        $('.Details').slideToggle();

        return false;
    })
})

这里是对应的jsfiddle.

这是我的答案。 不过我用的方式有点菜鸟。 所以我会改的更干净

var details            = $('.details').html();
var detailsTemplate    = Handlebars.compile(details);
var detailsPlaceholder = $(this);

  $('.item').each(function(i){

    $(this).find('a').on('click',function(){

      $('.details').remove();

      var html_details = detailsTemplate(data[i]);
      var itemIndex = $(this).closest('.item').index()
      var itemWidth = $('.item').outerWidth(true)

      var position = $(this).closest('.item').offset().left

      tiles3(i,itemIndex);

      function tiles3(i,itemIndex){

          if(i%3 == 0){

              var left =  $('.item').length -  itemIndex;

              if(left == 1){

                $('.item').eq(i).after(html_details)

              } else if(left == 2) {

                $('.item').eq( (i%3) + i + 1 ).after(html_details)

              } else {

                $('.item').eq( (i%3) + i + 2 ).after(html_details)

              }

          } else if(i%3 == 1){

              var left =  $('.item').length -  itemIndex;

              if(left == 1){

                $('.item').eq(i).after(html_details)

              } else {

                $('.item').eq( (i%3) + i ).after(html_details)

              }

          } else {

              $('.item').eq( i ).after(html_details)

          }
      }

      return false;

    })

  })
}