7

我有这个 HTML 结构:

<div class="article-body">
<p>
    <a href="http://www.example.com">My Link</a>
Lorem Ipsum Dolor Sit amet.

</p>
<p><a href="http://www.example.com">Link that I must select.</a></p>
</div>​

我必须将一个类应用于第二个链接,即没有文本节点的链接。我尝试了“p:empty a”和“p > a:only-child”,但它们不起作用......有一种方法可以使用 jQuery 选择它吗?

4

5 回答 5

7

不能用选择器做,但你可以filter()用来执行自定义选择:

$('p').filter(function(){
    var $clone = $(this).clone();
    $clone.children().remove();
    return !$clone.text();
}).addClass("red");​

在这里,有一个小提琴:http: //jsfiddle.net/adrianonantua/5daYT/

:)

更新

end()根据@dfsq 的建议,我们可以在一行中利用并制作相同的逻辑:

$('p').filter(function(){
    return !$(this).clone().children().remove().end().text();
}).addClass("red");​
于 2012-10-30T20:11:51.210 回答
3

另一个解决方案filter()

$("p").filter(function() {
    return $(this).contents().filter(function() {
        return this.nodeType == 3 && $.trim(this.nodeValue) != "";
    }).length == 0;
}).addClass("myClass")​;

演示:http: //jsfiddle.net/wyvLC/

于 2012-10-30T20:14:34.553 回答
3

This will be a very fast solution. No cloning needed:

$("p > a").filter(function(i, el) {
    return !el.previousSibling && !el.nextSibling;
}).parent();

Or this:

$("p").filter(function(i, el) {
    return el.firstChild && 
           el.firstChild === el.lastChild && 
           el.firstChild.nodeName.toUpperCase() === "A";
});
于 2012-10-30T20:31:59.180 回答
2

这应该可以工作http://jsfiddle.net/nvass/

$("p").filter(function(){
    return $.grep(this.childNodes,function(node){
         return node.nodeType === 3 && node.nodeValue.replace(/(\s|\n|\r|\t)/g,"") !== "";
    }).length === 0;
}).css("background-color","green");
于 2012-10-30T20:14:15.013 回答
0
于 2012-10-30T20:23:30.900 回答