混淆 jQuery 中的 wrapAll

Confusing wrapAll in jQuery

我在下面的几里里有几个p,也有https://jsfiddle.net/y5zn538e/

<ul>
  <li>
    <p> Hello 1</p>
    <p> Hello 2</p>
    <p> Hello 3</p>
  </li>
  <li>
    <p> Hello 4</p>
    <p> Hello 5</p>
    <p> Hello 6</p>
  </li>
</ul>

我想包装一个 div,使其像下面的第二个一样包装

<ul>
  <li>
    <p> Hello </p>
    <div>
      <p> Hello </p>
      <p> Hello </p>
    </div>
  </li>
  <li>
    <p> Hello </p>
    <div>
      <p> Hello </p>
      <p> Hello </p>
    </div>
  </li>
</ul>

我试过如下:

 $('ul li >p:not(:first-child)').wrapAll('<div></div>'); 

但是,这似乎不起作用..我的意思是它所做的一切都需要所有 p 并将其包装起来。我想在每个 li 中包装一个 div ?

使用.each()遍历每个<li>然后操作它的children<p>

$('ul li').each(function(){
    $('> p:not(:first-child)',this).wrapAll('<div/>');
});

Updated Fiddle


为什么你的代码不起作用?

$('ul li >p:not(:first-child)') 获取所有 <p> 的集合,这些 child 不是他们 parent 的第一个 child。然后它将它们包装在 <div> 中。此集合不考虑单独的 <li> parents.

The problem is, li > p:not(:first-child) it collects all child p tags except the first child.

so You need to use .each() function iterate to all li.

$('ul li').each(function(){
  $(this).find('p:not(:first-child)').wrapAll('<div></div>'); 
});

  $('ul li').each(function(){
       $(this).find('p:not(:first-child)').wrapAll('<div></div>'); 
     });
div{
  color: red;
  }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
      <li>
         <p> Hello 1</p> 
         <p> Hello 2</p > 
         <p> Hello 3</p> 
      </li> 
      <li>
         <p> Hello 4</p> 
         <p> Hello 5</p > 
         <p> Hello 6</p> 
      </li> 
     </ul>