Dor*_*şin 6 javascript jquery wrapall
我正在使用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>');
});Run Code Online (Sandbox Code Playgroud)
这是我愚蠢的js代码:
<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>Run Code Online (Sandbox Code Playgroud)
jsfiddle:http://jsfiddle.net/Lwk97rvq/1/
小智 5
您可以创建自己的 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);
};
Run Code Online (Sandbox Code Playgroud)
所以你可以调用它nextUntilWithTextNodes而不是nextUntil你很高兴去。
只有 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>');
}
});
Run Code Online (Sandbox Code Playgroud)
它只是迭代所有节点并基于标志启动一个新集合,或包装找到的节点。
最后一个if (open)允许在分类 div 中使用未封闭的 spolier 块content。
笔记:
$()是一个空的 jQuery 集合(类似于空数组,但对于 jQuery 对象)result.wrapAll('<div class="spoiler"></div>');例如http://jsfiddle.net/ykv3gf5L/3/