jQuery: prev(<selector>) 不工作?

Posted

技术标签:

【中文标题】jQuery: prev(<selector>) 不工作?【英文标题】:jQuery: prev(<selector>) not working? 【发布时间】:2011-07-24 02:24:45 【问题描述】:

我在 jQuery 中使用 prev() 时遇到问题,它没有选择正确的元素。

我的html结构如下:

<section id="about">
    ...
</section>
<hr>
<section id="contact">
    ...
</section>

“活动”部分是#contact。我想选择上一节跳过&lt;hr&gt;

active = active.prev('section') 似乎不起作用。我想我可能读错了文档...

如果我取出&lt;hr&gt;,一切都会很好。关于如何跳过 prev() 上的&lt;hr&gt; 的任何想法?

TIA

【问题讨论】:

【参考方案1】:

我想我可能读错了文档...

API docs for .prev() 给出这样的描述:

描述: 获取匹配元素集中每个元素的前一个兄弟元素,可选地由选择器过滤。

所以,问题在于hr 存在并且被.prev() 搜索,然后针对'section' 选择器进行测试。


关于如何跳过 prev() 上的&lt;hr&gt; 有什么想法吗?

您可以调用一次.prev() 以跳过该hr,然后再次调用该部分:

active = active.prev().prev('section');

或使用.prevAll() 并找到最接近的前一个(以防在它之前出现任何其他部分):

active = active.prevAll('section').first();

【讨论】:

谢谢!所以无论选择器是什么,prev() 都是到下一个兄弟的一步?我在想 prev('section') 会匹配匹配选择器的第一个前一个兄弟。我使用 prevAll('section').first() 似乎最近的兄弟在数组的开头。但仍然感谢您将我推向正确的方向! :) @Jules 是对的。答案应该更新。需要.first() 而不是.last() 是的,当提问者一开始就指出同样的事情时,我什至承认了这一点。我终于更新了答案。【参考方案2】:

改用prevAll()

active = active.prevAll('section').first();

来自 jQuery 文档:

prev() => "获取前一个兄弟" 所以它只会获取第一个元素。

prevAll() => "获取匹配元素集中每个元素的所有前面的兄弟,可选地由选择器过滤。"

这就是为什么当您删除 &lt;hr&gt; 时,它将与 prev() 一起使用。

【讨论】:

【参考方案3】:

或者试试:

<section id="about">
    ...
<hr>
</section>
<section id="contact">
    ...
</section>

【讨论】:

【参考方案4】:

做吧

active = active.prevAll('section').eq(0);

似乎 .prev() 和 .next() 只选择最近的兄弟,无论您是否为其提供特定的选择器。如果该选择器与兄弟不匹配,.next('section').length 将为 0。 因此,通过使用上述方法,您可以获得与您的选择器匹配的所有前面的兄弟姐妹,并使用 .eq(0) 选择最接近的兄弟姐妹。

【讨论】:

以上是关于jQuery: prev(<selector>) 不工作?的主要内容,如果未能解决你的问题,请参考以下文章

Jquery常用的选择器都有哪些

jquery js 兄弟父元素的获取

第二章-jQuery选择器

jQuery:将 Prev 和 Next 添加到选项卡

jquery中获取相邻元素相关的命令:next()prev()和siblings()

jquery 选择器