Javascript 在JQ指定之前,如何选择以前的元素?

Javascript 在JQ指定之前,如何选择以前的元素?,javascript,jquery,Javascript,Jquery,我继承了带有菜单的模板,其中类别和子类别在同一范围内。以下是一个例子: <ul class="menu"> <li class="cat" data-item-type="category"></li> <li data-item-type="sub-category"></li> <li data-item-type="sub-category"></li> <li dat

我继承了带有菜单的模板,其中类别和子类别在同一范围内。以下是一个例子:

<ul class="menu">
    <li class="cat" data-item-type="category"></li>
    <li data-item-type="sub-category"></li>
    <li data-item-type="sub-category"></li>
    <li data-item-type="sub-category"></li>
    <li data-item-type="sub-category"></li>
    <li class="cat" data-item-type="category"></li>
    <li data-item-type="sub-category"></li>
    <li data-item-type="sub-category"></li>
    <li data-item-type="sub-category"></li>
    <li data-item-type="sub-category"></li>
    <li class="cat" data-item-type="category"></li>
    <li class="cat" data-item-type="category"></li>
    <li data-item-type="sub-category"></li>
    <li data-item-type="sub-category"></li>
</ul>
我不能改变它的结构,但可以添加额外的属性


因此,我的问题是,当单击其中一个子类别时,是否可以选择所有类别子类别。通常,我需要选择所有
li
,直到第一次
class=“cat”
data item type=“category”
出现,包括它-category及其所有子项

根据OP的更新更新答案:

$('li[data-item-type="sub-category"]').click(function() {
  $(this)
     .add( $(this).nextUntil('.cat') )
     .add( $(this).prevUntil('.cat') )
     .prev('.cat').addBack() //in jQuery < 1.8, replace addBack by andSelf
     //do something
});

因此
.prevAll('.cat:first')
匹配前一个
.cat
nextUntil('.cat')
获取其所有子类别,并
addBack
(或在旧版本中
和self
)将
.cat
元素添加回匹配的元素集中

在最新的jQuery版本中,
.add()
.addBack()
方法按照文档顺序对匹配的元素进行排序,因此这两种方法都将
.cat
作为集合中的第一个元素,然后是文档顺序中的子类别


参考

根据OP的更新更新答案:

$('li[data-item-type="sub-category"]').click(function() {
  $(this)
     .add( $(this).nextUntil('.cat') )
     .add( $(this).prevUntil('.cat') )
     .prev('.cat').addBack() //in jQuery < 1.8, replace addBack by andSelf
     //do something
});

因此
.prevAll('.cat:first')
匹配前一个
.cat
nextUntil('.cat')
获取其所有子类别,并
addBack
(或在旧版本中
和self
)将
.cat
元素添加回匹配的元素集中

在最新的jQuery版本中,
.add()
.addBack()
方法按照文档顺序对匹配的元素进行排序,因此这两种方法都将
.cat
作为集合中的第一个元素,然后是文档顺序中的子类别


参考
使用jQuery

使用jQuery


这将根据您对类别和子类的请求(更新)解决您的问题(不是bug)


单击子节点猫节点并选择其周围的其他子节点,同时选择其类别

,这将根据您对类别和子节点的请求(更新)解决您的问题(而不是buggy)



要单击子节点猫节点,并选择其周围的其他子节点及其类别,请查看下一个匹配的同级操作符:查看下一个匹配的同级操作符:我需要在单击子节点时获取它,而不是在猫节点上。几乎在那里,但我也需要那个类别。@Kirix你是说在组中第一个子类别之前的类别,对吗?@Kirix好的,根据你的问题要求,我相信现在这个更新是100%。在你复习的时候,我会尝试重构一下这段代码。@Fabriciomatté注意:这对没有子类别的类别不起作用。我需要在单击子类别时得到它,而不是在cat上。几乎在那里,但我也需要那里的类别。@Kirix你是说在组中第一个子类别之前的类别,对吗?@Kirix好的,有了这个更新,我相信现在它是100%根据您的问题的要求。在你复习时,我会尝试重构一下这段代码。@Fabriciomatté注意:这对没有子类别+1的类别不起作用。如果OP需要该功能,单击
.cat
,它也会起作用。这是你的代码演示,谢谢你为我的代码做了一个演示,虽然Kirix的更好,如果它是有组织的,你的意思是更好的缩进/换行?如果您愿意,可以随意编辑/设置样式并添加到答案中
=]
+1单击
.cat
也可以工作,以防OP需要该功能。这是你的代码演示,谢谢你为我的代码做了一个演示,虽然Kirix的更好,如果它是有组织的,你的意思是更好的缩进/换行?如果您愿意,可以随意编辑/设置样式并添加到答案中<代码>=]
$('li.cat').on('click', function() {
   $(this).nextUntil('.cat');
   /* then write you logic here */
});
  $('li').click(function() {
       var x = $(this).add($(this).nextUntil('.cat')).add($(this).not('.cat').prevUntil('.cat')).andSelf().add($(this).not('.cat').prevAll('.cat:first'));
  });