【问题标题】:JQuery wrapAll, append, remove to move elements and add a divJQuery wrapAll, append, remove 移动元素并添加一个 div
【发布时间】:2014-12-12 11:49:38
【问题描述】:

我正在尝试移动,并可能删除一些元素,同时用“div”包装更新的 HTML。我必须使用一个相等的计数,我已经能够计算(假设我想将它分成 5 个,直到有任何剩余的 li 标签)

尝试了 .wrapAll 和 .append、.remove 等,但在我更新之前,一些 HTML 已被删除。

如果 class='x' 存在,HTML 将被相应地移动(不改变 lis 的内容或顺序),但我们只是不考虑它在 <ul> 每 5 个元素的拆分/计算中。

因此,更新后的 HTML 中可能有多个 'li class='x',但最初每个 <ul> 标记始终只有一个(并且它始终是原始 HTML 中的第一个元素)。

当前 HTML:

 <ul>   
        <li class="x">First</li>
        <li>One</li>
        <li>Two</li>
        <li>Three   </li>
        <li>Four</li>
        <li>5</li>
    </ul>
    <ul>    
        <li class="x">Second</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
        <li>10</li>
        <li>11</li>
        <li>12</li>
        <li>13</li>
        <li>14</li>
        <li>15</li>
    </ul>
    <ul>    
        <li class="x">Third</li>
        <li>16</li>
        <li>17</li>
    </ul>   

移动

  • 先前基于特定计数。 向这些 ul 添加一个 div 'wrapper' 类 删除任何剩余的标签

    所需的 HTML 结果:

    <ul>    
        <li class="x">First</li>
        <li>One</li>
        <li>Two</li>
        <li>Three</li>
        <li>Four</li>
        <li>5</li>
    </ul>
    <ul>    
        <li class="x">Second</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
        <li>10</li>   
    </ul>
    <ul>    
        <li>11</li>
        <li>12</li>
        <li>13</li>
        <li>14</li>
        <li>15</li>   
    </ul>   
    <ul> 
        <li class="x">Third</li>
        <li>16</li>
        <li>17</li>
    </ul>
    
  • 【问题讨论】:

      标签: jquery append wrapall


      【解决方案1】:

      试试这个:

      更新:更改了代码以反映 OP 的 cmets。

      function splitEm() {
          var $uls = $("ul");
          var $last = $uls.last();
          var $lis = $uls.children("li").detach();
          var points = [], count=0, prevIndex = 0;
          $.each($lis, function (index, item) {
              var i =  $(item).is(".x")?0:1;
              count += i;
              if(count%5 == 0 && i) {
                  points.push(index - (prevIndex)?0:1;
                  prevIndex = index;
              } 
          });
      
          if(prevIndex != $lis.length) {
              points.push($lis.length - prevIndex);
          }
      
          $.each(points, function(index, item) {
              var $curUL = null;
              if(index < $uls.length) { 
                  $curUL = $uls.eq(index);
              }   else {
                  $curUL = $("<ul/>").insertAfter($last);
                  $last = $curUL;
              }
              $curUL.append($lis.splice(0, item));
          });
      }
      
      $(splitEm);
      

      JsFiddle:http://jsfiddle.net/yd14gw5d/4/

      【讨论】:

      • 嗨。我试过了,但是当我将前 3 个
          中的元素数量更改为小于 5 时,它不起作用。因为我仍然需要将它平均分成 5 个一组(直到最后一个 ul 中剩下小于或等于 5 个)。所以在这种情况下,我必须将元素从第二个
      • @Amy 更新了答案,你能检查一下你在看什么吗?
      • 您好,非常感谢!它按预期工作,我只是运行更多场景来验证它。只有最后一件事。我不希望它在 5 个结果中计入 'class=x',并尝试将您的逻辑应用于相同的结果,只是不确定将要排除的类的检查放在哪里......
      • 你的意思是 x 类的 li 元素应该在它们所在的 UL 中?如果是这样,如果 UL 已经包含 class=x 的 li,它应该有多少 li
      • class='x' 也必须相应地移动,我只是不将它计入拆分/移动中的 5 个 中。如果 class='x' 存在,我们会移动它,但我们只是没有在 $uls.length 中考虑它来拆分..
      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 2012-02-20
      • 2012-01-12
      • 1970-01-01
      • 2012-08-01
      相关资源
      最近更新 更多