Jquery nextUntil包含文本节点

我正在使用nextUntil方法来获取两个元素之间的所有东西。 但是此方法不包括要输出的text nodes 。 它给出了一个像[
,
,
]
这样的数组。 我如何获得包括文本节点在内的所有内容? 谢谢。

这是html代码:

 
--- spoiler ---

dangerous text here
--- spoiler ---
safe text here
--- spoiler ---

dangerous text here
--- spoiler ---

这是我的愚蠢的js代码:

 $('.content a:contains("spoiler").b:even').each(function(){ $(this).nextUntil('.content a:contains("spoiler").b') .wrapAll('
'); });

jsfiddle: http : //jsfiddle.net/Lwk97rvq/1/

只有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('
'); open = false; } else { result = $(); open = true; } } else { result = result.add($this) } }); if (open) { result.wrapAll('
'); } });

它只是迭代所有节点,并基于一个标志启动一个新的集合,或包装找到的节点。

最终的if (open)允许在content类别div中使用未封闭的spolier块。

笔记:

  • $()是一个空的jQuery集合(就像一个空数组,但对于jQuery对象)
  • 我建议你使用一个样式作为你的剧透,并使用一个类,例如result.wrapAll('

    ');

例如http://jsfiddle.net/ykv3gf5L/3/

您可以创建自己的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 ,你就可以了。