Javascript 仅选择两个选择器中的一个

Javascript 仅选择两个选择器中的一个,javascript,jquery,Javascript,Jquery,给定一个包含jQuery对象$c,其中包含多个元素,这些元素包含类名为tmpSelected和selected的元素,我只想从$c中为每个类名选择一个元素,最好是tmpSelected。标记是以下内容的复杂版本: <ul id="a"> <li class="selected"><a href="foo">Foo</a></li> <li><a href="bar">Bar</a>&l

给定一个包含jQuery对象
$c
,其中包含多个元素,这些元素包含类名为tmpSelected和selected的元素,我只想从
$c
中为每个类名选择一个元素,最好是tmpSelected。标记是以下内容的复杂版本:

<ul id="a">
    <li class="selected"><a href="foo">Foo</a></li>
    <li><a href="bar">Bar</a></li>
    <li><a href="baz">Baz</a></li>
    <li><a href="biz">Biz</a></li>
</ul>
<ul id="b">
    <li><a href="woo">Woo</a></li>
    <li><a href="war">War</a></li>
    <li class="tmpSelected"><a href="waz">Waz</a></li>
    <li><a href="wiz">Wiz</a></li>
</ul>
<ul id="c">
    <li class="selected"><a href="xuu">Xuu</a></li>
    <li class="tmpSelected"><a href="xur">Xur</a></li>
    <li><a href="xuz">Xuz</a></li>
    <li><a href="xyz">Xyz</a></li>
</ul>

有没有一种不显式循环的合理方法?(另请注意,当不存在
.tmpSelected
.selected
子项时,返回空选择器是可以的。)

我建议这样做,它在概念上与您已经拥有的非常相似,只是可以保证它只为每个父项返回单个项

var selected = $("#a, #b, #c").map(function() {
   var item = $(this).find(".tmpSelected");
   if (!item.length) {
       item = $(this).find(".selected");
   }
   return(item.get(0));
});

我建议这是非常类似的概念,你已经有除了这保证它只会返回一个单一的项目为每个家长

var selected = $("#a, #b, #c").map(function() {
   var item = $(this).find(".tmpSelected");
   if (!item.length) {
       item = $(this).find(".selected");
   }
   return(item.get(0));
});

这是一个选择器,但它相当混乱。我相信它给出了正确的解决方案:

$("ul > li.tmpSelected, ul:not(:has(li.tmpSelected)) > li.selected");
首先,查找和
.tmpSelected
元素。然后查找任何只包含
选定
元素的
ul
:has
选择器查找子元素,我使用
:not
选择器查找
ul
元素。然后我只需抓取子元素
选中的
元素


这里有一个选择器,但它很乱。我相信它给出了正确的解决方案:

$("ul > li.tmpSelected, ul:not(:has(li.tmpSelected)) > li.selected");
首先,查找和
.tmpSelected
元素。然后查找任何只包含
选定
元素的
ul
:has
选择器查找子元素,我使用
:not
选择器查找
ul
元素。然后我只需抓取子元素
选中的
元素


如果没有
.selected
,它如何为每个家长返回一个
.tmpSelected
项目?如果没有
.tempSelected
,它如何仅为每个家长返回一个
.selected
项目?我现在已经更新了它。我想这就是OP所要求的。@JohnKalberer如果包含元素中同时有
.selected
.tmpSelected
元素,这难道不会给我什么吗?但我认为这是正确的选择-
“ul>li.tmpSelected,ul:not(:has(li.tmpSelected))>li.selected”
是答案,你同意吗?@John Kalberer可能是你应该再添加一个选择器
ul:has(li.selected)>li.tempSelected
?要获取
tempSelected
,如果它有一个
selected
sibling?@kojiro yes,如果你总是想抓取
.tmpSelected
如果它在那里,那么你就是正确的。如果没有
.selected
,它如何为每个家长返回单个
.tmpSelected
项目,如果没有
,它如何只为每个家长返回一个
。如果没有
。tempSelected
,我现在已经更新了它。我想这就是OP所要求的。@JohnKalberer如果包含元素中同时有
.selected
.tmpSelected
元素,这难道不会给我什么吗?但我认为这是正确的选择-
“ul>li.tmpSelected,ul:not(:has(li.tmpSelected))>li.selected”
是答案,你同意吗?@John Kalberer可能是你应该再添加一个选择器
ul:has(li.selected)>li.tempSelected
?要获得
tempSelected
如果它有一个
选中的
兄弟姐妹?@kojiro是的,如果你总是想抓住
。tmpSelected
如果它在那里,那么你是正确的+1,尽管我可能应该提到,每个
ul
永远不会有一个以上的
。selected/.tmpSelected
元素。但直言不讳几乎没有什么坏处+1尽管我可能应该提到,每个
ul
将不会有超过一个
.selected/.tmpSelected
元素。但直言不讳几乎没有什么坏处!