jquery在课堂上找到最近的兄弟姐妹

dau*_*lex 141 html jquery traversal tree-traversal

这是我开始使用的粗略html:

<li class="par_cat"></li>
<li class="sub_cat"></li>
<li class="sub_cat"></li>
<li class="par_cat"></li> // this is the single element I need to select
<li class="sub_cat"></li>
<li class="sub_cat"></li>
<li class="sub_cat current_sub"></li> // this is where I need to start searching
<li class="par_cat"></li>
<li class="sub_cat"></li>
<li class="par_cat"></li>
Run Code Online (Sandbox Code Playgroud)

我需要遍历.current_sub,找到最接近的先前.par_cat并做一些事情.

.find("li.par_cat")返回整个负载.par_cat(我在页面上有大约30个).我需要针对单一目标.

非常感谢任何提示:)

kar*_*m79 247

尝试:

$('li.current_sub').prevAll("li.par_cat:first");
Run Code Online (Sandbox Code Playgroud)

用你的标记测试它:

$('li.current_sub').prevAll("li.par_cat:first").text("woohoo");
Run Code Online (Sandbox Code Playgroud)

li.par_cat用"woohoo" 填充最接近的前一个.

  • 这是否意味着`:first`正在处理最接近所选对象的返回元素列表(而不是相对于页面从上到下)? (8认同)
  • 实际上,在发短信之后,.prev()在几个实例中失败了..prevAll with:首先,每次都工作.谢谢. (3认同)
  • 非常感谢你非常有用的答案.你能否回答一下@NReilingh的问题,因为它让我很困惑.不是`:first`一个CSS选择器,它选择*DOM*中的第一个元素(例如`div.red:first`将选择*DOM*中的第一个红色DIV)jQuery是否以不同的方式解析选择器? (2认同)

Ed *_*mes 17

尝试

$('li.current_sub').prev('.par_cat').[do stuff];

  • 等等,什么?这不是只检查前面的元素吗?那么你的代码会返回null吗? - 在这里测试jsFiddle:http://jsfiddle.net/Y2TEH/ (19认同)
  • @EdWoodcock考虑在这种情况下更新你的答案. (8认同)
  • @DavidHobs两年前我写过这篇文章......我当然会使用prevAll(). (4认同)

epr*_*hro 13

使用prevUntil()将允许我们得到一个遥远的兄弟,而不必得到所有.我有一个特别长的设置,使用prevAll()过于CPU密集.

var category = $('li.current_sub').prev('li.par_cat');
if (category.length == 0){
  category = $('li.current_sub').prevUntil('li.par_cat').last().prev();
}
category.show();
Run Code Online (Sandbox Code Playgroud)

如果它匹配,这将得到第一个前面的兄弟,否则它得到匹配的兄弟之前的兄弟,所以我们只用prev()再一个来获得所需的元素.


Tom*_*ugh 5

我认为所有的答案都缺乏一些东西.我更喜欢使用这样的东西

$('li.current_sub').prevUntil("li.par_cat").prev();
Run Code Online (Sandbox Code Playgroud)

保存您不添加:首先在选择器内部,更容易阅读和理解.prevUntil()方法也有更好的性能,而不是使用prevAll()