jQuery:选择相邻的标签,除非被文本分隔
jQuery: Selecting adjacent tags unless separated by text
我正在尝试查找并合并段落内相邻的 em
标签,但事实证明这比我预期的要困难。考虑以下示例:
<p><em>Hello</em><em> World</em></p>
<p><em>Hello</em> <em>World</em></p>
<p><em>Hello</em> to the <em>World</em></p>
在上面的第一个和第二个示例中,我希望 $("em + em")
正确 select 第二个 em
标记。让我没想到的是,它还会 select 像第三个例子中的文本出现在它们之间的情况。
有没有办法检测这些标签之间的文本并区别对待它们?
What I didn't expect was that it would also select cases like the third example where text appears between them.
相邻兄弟组合器 +
不考虑文本。它只是 select 紧随其后的兄弟元素。
您可以根据前一个兄弟元素是元素还是空格来过滤所有相邻的 em
元素,如果标签之间出现文本则排除该元素。
在下面的示例中,第三个 p
中的 em
未被 select 编辑,因为前一个节点是文本。
var $previousSiblings = $('em + em').filter(function () {
var prev = this.previousSibling;
return prev.nodeType === 1 ? true : !prev.nodeValue.trim();
});
$previousSiblings.css('color', '#f00');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p><em>Hello</em><em> World</em></p>
<p><em>Hello</em> <em>World</em></p>
<p><em>Hello</em> to the <em>World</em></p>
如果需要,您还可以创建自定义 jQuery 方法。
例如,这是一个自定义 .nextWithoutText()
方法,如果元素之间没有文本,它将 select 提供下一个元素。
用法:$('em').nextWithoutText('em')
:
$.fn.nextWithoutText = function(tag) {
return $('+' + tag, this).filter(function() {
var prev = this.previousSibling;
return prev.nodeType === 1 ? true : !prev.nodeValue.trim();
});
};
$('em').nextWithoutText('em').css('color', '#f00');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p><em>Hello</em><em> World</em></p>
<p><em>Hello</em> <em>World</em></p>
<p><em>Hello</em> to the <em>World</em></p>
我正在尝试查找并合并段落内相邻的 em
标签,但事实证明这比我预期的要困难。考虑以下示例:
<p><em>Hello</em><em> World</em></p>
<p><em>Hello</em> <em>World</em></p>
<p><em>Hello</em> to the <em>World</em></p>
在上面的第一个和第二个示例中,我希望 $("em + em")
正确 select 第二个 em
标记。让我没想到的是,它还会 select 像第三个例子中的文本出现在它们之间的情况。
有没有办法检测这些标签之间的文本并区别对待它们?
What I didn't expect was that it would also select cases like the third example where text appears between them.
相邻兄弟组合器 +
不考虑文本。它只是 select 紧随其后的兄弟元素。
您可以根据前一个兄弟元素是元素还是空格来过滤所有相邻的 em
元素,如果标签之间出现文本则排除该元素。
在下面的示例中,第三个 p
中的 em
未被 select 编辑,因为前一个节点是文本。
var $previousSiblings = $('em + em').filter(function () {
var prev = this.previousSibling;
return prev.nodeType === 1 ? true : !prev.nodeValue.trim();
});
$previousSiblings.css('color', '#f00');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p><em>Hello</em><em> World</em></p>
<p><em>Hello</em> <em>World</em></p>
<p><em>Hello</em> to the <em>World</em></p>
如果需要,您还可以创建自定义 jQuery 方法。
例如,这是一个自定义 .nextWithoutText()
方法,如果元素之间没有文本,它将 select 提供下一个元素。
用法:$('em').nextWithoutText('em')
:
$.fn.nextWithoutText = function(tag) {
return $('+' + tag, this).filter(function() {
var prev = this.previousSibling;
return prev.nodeType === 1 ? true : !prev.nodeValue.trim();
});
};
$('em').nextWithoutText('em').css('color', '#f00');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p><em>Hello</em><em> World</em></p>
<p><em>Hello</em> <em>World</em></p>
<p><em>Hello</em> to the <em>World</em></p>