jQuery选择器,用于确定';还是';?

jQuery选择器,用于确定';还是';?,jquery,css-selectors,Jquery,Css Selectors,假设我的HTML看起来有两种方式: 备选案文1: <h2>My header <span class="apple">My Span</span> </h2> <h2>My header <span class="apple">My Span <span>My Span Inserted via jQuery</span> </span> <

假设我的HTML看起来有两种方式:

备选案文1:

<h2>My header
    <span class="apple">My Span</span>
</h2>
<h2>My header
    <span class="apple">My Span
        <span>My Span Inserted via jQuery</span>
    </span>
</h2>
我的头
我的跨度
备选案文2:

<h2>My header</h2>
<h2>My header
    <span>My Span Inserted via jQuery</span>
</h2>
我的头
通过jAuery,我想将一个span附加到嵌套span(如果有)或直接附加到标头,从而产生以下结果之一:

备选案文1:

<h2>My header
    <span class="apple">My Span</span>
</h2>
<h2>My header
    <span class="apple">My Span
        <span>My Span Inserted via jQuery</span>
    </span>
</h2>
我的头
我的跨度
我的Span通过jQuery插入
备选案文2:

<h2>My header</h2>
<h2>My header
    <span>My Span Inserted via jQuery</span>
</h2>
我的头
我的Span通过jQuery插入

是否有一个聪明的选择器可以检测上述两种情况?当然,我可以先检查我的标题是否有一个包含“apple”类的跨度。如果是这样,就这样做,否则就那样做。不过,我想知道是否有一个更优雅、更简洁的解决方案

我认为使用一个children过滤器,然后使用andSelf()可以同时获得这两个过滤器。然后,您可以使用第一个选项来选择正确的选项。如果children为空,那么first将是唯一的元素,即header

$('h2').each( function() {
    $(this).children('span')
           .andSelf()
           .filter(':first')
           .append('<span>My Span Inserted via JQuery</span>');
});
$('h2')。每个(函数(){
$(this.children('span'))
.andSelf()
.filter(“:first”)
.append('通过JQuery插入的我的跨度');
});

更新了以使用filter()(而不是第二次查找)。

我认为使用子过滤器,然后使用andSelf()可以同时获得两者。然后,您可以使用第一个选项来选择正确的选项。如果children为空,那么first将是唯一的元素,即header

$('h2').each( function() {
    $(this).children('span')
           .andSelf()
           .filter(':first')
           .append('<span>My Span Inserted via JQuery</span>');
});
$('h2')。每个(函数(){
$(this.children('span'))
.andSelf()
.filter(“:first”)
.append('通过JQuery插入的我的跨度');
});

更新了以使用filter()(而不是第二次查找)。

以下选择器选择所有
中没有
元素的
元素作为父元素的

$("h2:not(:has(span)), h2 > span")
      .append("<span>My Span Inserted via jQuery</span>");
$(“h2:not(:has(span)),h2>span”)
.append(“通过jQuery插入的我的跨度”);

以下选择器选择所有不包含
元素
或包含
作为父元素的
元素

$("h2:not(:has(span)), h2 > span")
      .append("<span>My Span Inserted via jQuery</span>");
$(“h2:not(:has(span)),h2>span”)
.append(“通过jQuery插入的我的跨度”);

谢谢。andSelf()看起来是完美的解决方案。我可以看到很多这样的保险丝。似乎无法让它工作,它似乎不匹配一个简单的h2?看,这不起作用,是错误的答案@早上咖啡,明白了吗right@Scott--第二个find()应该是筛选器()。更正。谢谢。andSelf()看起来是完美的解决方案。我可以看到很多这样的保险丝。似乎无法让它工作,它似乎不匹配一个简单的h2?看,这不起作用,是错误的答案@早上咖啡,明白了吗right@Scott--第二个find()应该是筛选器()。更正。我希望您可以在集合上操作,而不必对每个集合进行foreach。请注意,这将在整个DOM上迭代两次,每个选择器一次——每个选择器对整个文档调用一次Sizzle。我的答案在DOM上重复了一次,我是为了他的“不那么冗长”标准,他并没有真正提到性能是一个问题。你的解决方案更快,但我相信我的解决方案不会那么突兀。谢谢你的咖啡。那肯定没那么冗长了。将不得不考虑性能问题,但这也是一个很好的选择!我喜欢您可以在集合上操作,而不必对每个集合进行foreach。要知道,这将在整个DOM上迭代两次,每个选择器一次——每个选择器对整个文档调用一次Sizzle。我的答案在DOM上重复了一次,我是为了他的“不那么冗长”标准,他并没有真正提到性能是一个问题。你的解决方案更快,但我相信我的解决方案不会那么突兀。谢谢你的咖啡。那肯定没那么冗长了。将不得不考虑性能问题,但这也是一个很好的选择!