Jquery nextUntil包含文本节点
我正在使用nextUntil
方法来获取两个元素之间的所有东西。 但是此方法不包括要输出的text nodes
。 它给出了一个像[
这样的数组。 我如何获得包括文本节点在内的所有内容? 谢谢。
,
,
]
这是html代码:
这是我的愚蠢的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
,你就可以了。