jQuery 在
之间包裹文本和元素标签
我需要包装两个
元素之间的所有内容,包括自由文本。
鉴于此来源:
<hr class=begin>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<a href=mauris.html>Mauris</a> id diam turpis, et faucibus nunc.
<div><img src=foo.png /></div>
<hr class=end>
我需要将 hr.begin
和 hr.end
标记之间的所有内容包装起来,如下所示:
<hr class=begin>
<div class=content>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<a href=mauris.html>Mauris</a> id diam turpis, et faucibus nunc.
<div><img src=foo.png /></div>
</div>
<hr class=end>
我不能使用像 .nextUntil(' hr.end')
因为这不会选择未标记的文本。
I need to wrap everything, including free text, that is between two <hr>
elements.
Given this source:
<hr class=begin>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<a href=mauris.html>Mauris</a> id diam turpis, et faucibus nunc.
<div><img src=foo.png /></div>
<hr class=end>
I need to wrap everything between the hr.begin
and hr.end
tags, like so:
<hr class=begin>
<div class=content>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<a href=mauris.html>Mauris</a> id diam turpis, et faucibus nunc.
<div><img src=foo.png /></div>
</div>
<hr class=end>
I cannot use a method like .nextUntil('hr.end')
because this will not select the untagged text.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
更新
我比以前的版本更喜欢这个版本:http://jsfiddle.net/ LbmCg/3/
(部分灵感来自JP给出的答案。)
原始答案
试试这个:http://jsfiddle.net/LbmCg/
如果有多于一组要换行,则需要进行一些调整。
jQuery 的
.contents()
返回所有节点,包括文本节点。所以这里我们遍历到hr.begin
的.parent()
,使用.contents()
获取其所有节点,然后过滤它们,跟踪我们何时找到开始和结束,并且只返回它们之间的元素。然后我们使用
.wrapAll()
将它们与div.content
包裹起来。编辑: 如果要换行多个集合,请尝试以下操作: http://jsfiddle.net/LbmCg/1/
编辑: 清理了两者中的一些内容例子。
Updated
I like this version better than my previous: http://jsfiddle.net/LbmCg/3/
(Partly inspired from the answer J-P gave.)
Original answer
Try this: http://jsfiddle.net/LbmCg/
If there's more than one set to wrap, there will some adjustment needed.
jQuery's
.contents()
returns all nodes including text nodes. So here we traverse to the.parent()
of thehr.begin
, get all of its nodes using.contents()
then filter through them, tracking when we've found the beginning and the end, and only returning the elements between them.Then we use
.wrapAll()
to wrap them with thediv.content
.EDIT: If there are multiple sets to wrap, try this: http://jsfiddle.net/LbmCg/1/
EDIT: Cleaned things up a little in both examples.
这可以处理多组
开始-内容-结束
序列。它将查找前面有hr.begin
元素的所有hr.end
元素,并且对于每个hr.end
,查找之间的前面的节点它和hr.begin
,然后它将它们全部包装在中。
This can handle multiple sets of the
begin - contents - end
sequence. It will look for allhr.end
elements preceded byhr.begin
elements and will, for eachhr.end
, find the preceding nodes between it andhr.begin
, and then it'll wrap them all in a<div class=content>
.theElement.contents()
将识别文本节点。由于jQuery.nextUntil()
实际上是jQuery.dir
的包装器,它会过滤掉文本节点的
nodeType
为 3 ,自定义jQuery.dir
可能会有所帮助。—
我用帕特里克的测试数据尝试了这个解决方案,它有效:
theElement.contents()
will recognize text nodes. SincejQuery.nextUntil()
is actually a wrapper aroundjQuery.dir
, which doeswhere text nodes that get filtered out have a
nodeType
of 3, a customjQuery.dir
might help here.—
I tried this solution with Patrick’s test data and it works:
有类似的问题,但我使用的是基于 FCKEditor 的 CMS,但由于使用 nextSibling 属性插入换行符 TextNodes,所以工作得不太热。如果可以的话,我通常不喜欢将 jQuery 内容与本机 JavaScript 混合在一起。我想出了这个片段,它更新了 Patrick DW 的解决方案,这可能对 jQuery 的使用更加友好。也不需要类来确定下一个块。
Had a similar problem, but I was using a CMS based on FCKEditor that didn't work so hot because of insertion of newline TextNodes from using the nextSibling property. I generally don't like to mix jQuery stuff with native JavaScript if I can help it either. I came up with this snippet that updates Patrick DW's solution that would probably be a bit more friendly for jQuery usage. Also doesn't require classes to determine next block.
如果您的 HR 和其他标签位于 div 内,例如
您可以使用 jQuery.contents() 例如
输出:
这样您就可以根据需要轻松地将它们分组。
If you HR and other tags are inside a div e.g.
You can use jQuery.contents() e.g.
outputs:
So you can easily club them in groups as you need.
user191688 代码的扩展版本。
这不仅是在兄弟姐妹中寻找“直到”,而且是在树上和树下寻找。
A extended version of user191688's code.
This on is not only looking for the "until" in siblings but also up and down the tree.