如何在特定子元素之后包装段落的内部内容?

Posted

技术标签:

【中文标题】如何在特定子元素之后包装段落的内部内容?【英文标题】:How to wrap inner content of a paragraph after specific child element? 【发布时间】:2014-09-05 16:11:57 【问题描述】:

我有几个类似这样的简历:

<p>
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tincidunt auctor purus, ut cursus quam fringilla id. Suspendisse a libero id mauris faucibus convallis at ut lacus.
  <br><br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tincidunt auctor purus, ut cursus quam fringilla id. Suspendisse a libero id mauris faucibus convallis at ut lacus.
  <br><br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tincidunt auctor purus, ut cursus quam fringilla id. Suspendisse a libero id mauris faucibus convallis at ut lacus.
  <br><br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tincidunt auctor purus, ut cursus quam fringilla id. Suspendisse a libero id mauris faucibus convallis at ut lacus.
  <br><br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tincidunt auctor purus, ut cursus quam fringilla id. Suspendisse a libero id mauris faucibus convallis at ut lacus.
  <br><br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tincidunt auctor purus, ut cursus quam fringilla id. Suspendisse a libero id mauris faucibus convallis at ut lacus.
</p>

不是最漂亮的文本块,但它们是由系统自动生成的。我需要遍历每个&lt;p&gt; 并在第一组中断标签之后获取所有内容并将其包装在&lt;div&gt; 之类的东西中。

最终结果是:

<p>
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tincidunt auctor purus, ut cursus quam fringilla id. Suspendisse a libero id mauris faucibus convallis at ut lacus.</p>

<div class="theRest">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tincidunt auctor purus, ut cursus quam fringilla id. Suspendisse a libero id mauris faucibus convallis at ut lacus.
  <br><br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tincidunt auctor purus, ut cursus quam fringilla id. Suspendisse a libero id mauris faucibus convallis at ut lacus.
  <br><br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tincidunt auctor purus, ut cursus quam fringilla id. Suspendisse a libero id mauris faucibus convallis at ut lacus.
  <br><br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tincidunt auctor purus, ut cursus quam fringilla id. Suspendisse a libero id mauris faucibus convallis at ut lacus.
  <br><br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tincidunt auctor purus, ut cursus quam fringilla id. Suspendisse a libero id mauris faucibus convallis at ut lacus.
</div>
</p>

【问题讨论】:

你可以使用 jquery wrap() api.jquery.com/wrap @rpogonyi 我试图使用一些涉及包装的东西。 jsfiddle.net/Ldycs37m 恐怕我的结果有点笨。 你需要像这样添加标签 .wrap('') 在我上面的小提琴中,它只包装了第二个中断标记之后的直接元素,而不是第二个中断标记之后的所有内容。我尝试用 nextSibling 代替 nextAll 无效。 将 class="addDiv" 添加到

元素,然后 $('.addDiv').wrap('

');
【参考方案1】:

试试这个(灵感来自@dave 的回答):

$("p").each(function()

    // Add a div after the second <br /> (in the current <p>)
    $("br:eq(1)", this).after('<div class="theRest"> </ div>');

    // Split each "child" in an array
    $(this).contents().filter(function(index, elem)

        // Keep only children after the <div />
        return index > 3;

    // Remove and put them into the <div />
    ).detach().appendTo($(".theRest", this));
);

Fiddle

【讨论】:

请为您的答案添加一些解释。发布代码对任何人都没有帮助:)【参考方案2】:

试试这个:

$('p').each(function() 
    $(this).contents(':gt(2)').wrap('<div class="theRest"></div>');
);

但这不是一个足够好的解决方案。

为了防止你的其他 p 元素被包装,你应该从下面的任何父元素中找到:

$('.father').find('p').each(function() 
    $(this).contents(':gt(2)').wrap('<div class="theRest"></div>');
);

【讨论】:

第一个例子似乎是一块一块的,把每一件事都包装在 div 标签中。我最终在每个

中添加了大约六个

。不幸的是,第二个例子什么也没做。
然而,在实时站点上,它仍然将每个单独的东西包装在新的 div 中。由于某种原因,每一行,每一 ,所有东西都有自己的 div 包装。 两个html代码可能有一些不同?【参考方案3】:

试试这个:

$($("p").contents().get(2)).after('<div class="theRest"></div>');
$("p").contents().filter(function(index, element) 
    return index > 3;
).detach().appendTo(".theRest");

Fiddle

【讨论】:

【参考方案4】:

即使从服务器返回的格式不符合我的标准,因为它使特定目的的事情变得复杂。但是,通过一些技巧,仍然有办法做到这一点。

说明:选择所有节点,丢弃第一个节点,因为它恰好是文本节点,然后使用 jquery wrapAll 方法获取该节点之后的所有内容并将其包装在新的 div 中。

演示:http://jsfiddle.net/qe3bm92e/3/

var txt = $('.txt').contents();
txt.splice(0,1);
txt.wrapAll($("<div>").addClass('red'));

您可以将'.txt' 替换为'p',但这不是一个好习惯,原因很明显。

【讨论】:

以上是关于如何在特定子元素之后包装段落的内部内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不删除子元素的情况下删除包装器(父元素)?

Angular:如何在不删除子元素的情况下删除包装器(父元素)?

排除具有特定子项的元素[重复项]

仅当子容器具有内容时,如何将类添加到特定的父元素

在怎样WORD中查找含有特定内容的段落并按顺序标上123456等等

如何段落首行缩进2字符