我正在使用nextUntil
方法来获取两个元素之间的所有内容。但是此方法不包括text nodes
输出。它给出了一个像[<br>, <br>, <br>]
这样的数组。我如何获得包括文本节点在内的所有内容?
这是HTML代码:
$('.content a:contains("spoiler").b:even').each(function() {
$(this).nextUntil('.content a:contains("spoiler").b')
.wrapAll('<div style="border:solid 1px black;"></div>');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="content">
--- <a class="b" href="/?q=spoiler">spoiler</a> ---
<br>
<br> dangerous text here
<br> --- <a class="b" href="/?q=spoiler">spoiler</a> ---
<br> safe text here
<br> --- <a class="b" href="/?q=spoiler">spoiler</a> ---
<br>
<br> dangerous text here
<br> --- <a class="b" href="/?q=spoiler">spoiler</a> ---
</div>
JSFiddle:http://jsfiddle.net/Lwk97rvq/1/
答案 0 :(得分:4)
只有jQuery .contents()
方法返回所有节点(包括通常被忽略的文本节点)。
所以也许这样的事情?:
http://jsfiddle.net/ykv3gf5L/2/
$('.content').each(function () {
var open = false;
var result = $();
$(this).contents().each(function () {
var $this = $(this);
if ($this.text() == "spoiler") {
if (open) {
result.wrapAll('<div style="border:solid 1px black;"></div>');
open = false;
} else {
result = $();
open = true;
}
} else {
result = result.add($this)
}
});
if (open) {
result.wrapAll('<div style="border:solid 1px black;"></div>');
}
});
它只是迭代所有节点,并根据标志启动一个新集合,或包装找到的节点。
最终if (open)
允许在content
入级div中使用未封闭的spolier块。
注意:
$()
是一个空的jQuery集合(就像一个空数组,但对于jQuery对象)result.wrapAll('<div class="spoiler"></div>');
答案 1 :(得分:2)
您可以创建自己的jquery插件,该插件与nextUntil
相同,但包含文本节点:
$.fn.nextUntilWithTextNodes = function (until) {
var matched = $.map(this, function (elem, i, until) {
var matched = [];
while ((elem = elem.nextSibling) && elem.nodeType !== 9) {
if (elem.nodeType === 1 || elem.nodeType === 3) {
if (until && jQuery(elem).is(until)) {
break;
}
matched.push(elem);
}
}
return matched;
}, until);
return this.pushStack(matched);
};
因此您可以将其命名为nextUntilWithTextNodes
而不是nextUntil
,这很好。