给定一个包含jQuery对象$c的元素,其中包含多个元素,其中包含具有类名tmpSelected并被选中的元素,我希望每个类名只从$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>在这种情况下,我想要得到的是$("#a > .selected, #b > .tmpSelected, #c > .tmpSelected") --如果.selected元素有.tmpSelected的同级,我想避免它,并且我不想为$c的每个成员选择多个子元素,其中有$c = $("#a, #b, #c")。
这就是我想出来的:
var $c = $("#a, #b, #c");
var $selected = $c.map(function (idx, el) {
var $el = $(el);
var $tmpSel = $el.children(".tmpSelected");
return $tmpSel.length ? $tmpSel : $el.children(".selected");
});是否有一种不需要显式循环的合理方法来做到这一点?(P.S. -如果不存在.tmpSelected或.selected子程序,则返回空选择器是可以的。)
发布于 2012-08-22 23:19:12
这是一个选择器,但很乱。我相信它给出了正确的解决办法:
$("ul > li.tmpSelected, ul:not(:has(li.tmpSelected)) > li.selected");首先,您需要查找和.tmpSelected元素。然后查找只包含ul元素的任何.selected。:has选择器查找子选择器,我使用:not选择器查找ul元素。然后,我只需获取子selected元素。
jsFiddle
发布于 2012-08-22 23:17:40
我建议这样做,这在概念上非常类似于您已经拥有的内容,但这保证了它只会为每个家长返回一个项目。
var selected = $("#a, #b, #c").map(function() {
var item = $(this).find(".tmpSelected");
if (!item.length) {
item = $(this).find(".selected");
}
return(item.get(0));
});https://stackoverflow.com/questions/12082603
复制相似问题