将相邻的<p>元素包装为<div>

时间:2019-07-02 13:43:22

标签: javascript jquery html dom

是否可以选择所有彼此相邻的<div>元素并将它们包装在<div class="content"> <p>one</p> <p>two</p> <h2> not p</h2> <p>three</p> <p>four</p> <p>five</p> <h3>not p</h3> <div>not p</div> <p>six</p> <p>seven</p> </div> 中?

例如我有

<div class="content">
  <div class="wrap">
    <p>one</p>
    <p>two</p>
  </div>
  <h2> not p</h2>
  <div class="wrap">
    <p>three</p>
    <p>four</p>
    <p>five</p>
  </div>
  <h3>not p</h3>
  <div>not p</div>
  <div class="wrap">
    <p>six</p>
    <p>seven</p>
  </div>
</div>

我想得到一些东西,像这样:

{{1}}

2 个答案:

答案 0 :(得分:2)

尝试一下,这是一个很好的起点:

$(function(){

  const target = 'p',
        invert = ':not(' + target + ')',
        wrap = '<div class="wrapper">',
        breakpoints = $('.content > *'+invert);
    
   breakpoints.each(function(){
        $(this).nextUntil(invert).wrapAll( wrap );
    });
    
   breakpoints.first().prevUntil(invert).wrapAll( wrap );
    
});
.wrapper{border:1px solid red;}
<script
  src="https://code.jquery.com/jquery-3.4.1.min.js"
  integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
  crossorigin="anonymous"></script>
<div class="content">
  <p>one</p>
  <p>two</p>
  <h2> not p</h2>
  <p>three</p>
  <p>four</p>
  <p>five</p>
  <h3>not p</h3>
  <div>not p</div>
  <p>six</p>
  <p>seven</p>
</div>

答案 1 :(得分:1)

好吧,该算法非常简单:遍历<p>个节点的数组,如果先前的兄弟姐妹本身是.wrapper,则将其放入先前的.wrapper,否则创建一个:

[...$('p')].forEach((p,i) => 
  $(p).prev().is('.wrapper') && i > 0  ?
  $(p).prev().append(p) : 
  $('<div class="wrapper"></div>').insertBefore(p).append(p))
.wrapper {background: lightblue}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><div class="content"><p>one</p><p>two</p><h2> not p</h2><p>three</p><p>four</p><p>five</p><h3>not p</h3><div>not p</div><p>six</p><p>seven</p></div>