【问题标题】:Using next() with block elements in between在块元素之间使用 next()
【发布时间】:2013-02-14 20:38:53
【问题描述】:

我正在尝试使用 jQuery 的 next() 来抓取所选元素的下一段,但因为有一个 div 挡住了路,似乎 next 不起作用。我应该改用什么选择器?

作品:

<div>
   <span class="clickme">A name here</span>
   <p class="showme" style="display:none;">Here's some text! </p>
</div>
$('.clickme').click(function() {
   $(this).next('.showme').slideDown();
});

不起作用:

<div>
   <span class="clickme">A name here</span>
   <div></div>
   <p class="showme" style="display:none;">Here's some text! </p>
</div>
$('.clickme').click(function() {
   $(this).next('.showme').slideDown();
});

为什么会发生这种情况?具有指定类的next() 不会超出下一个块元素吗?这就是发生这种情况的原因吗?是否有一个选择器指定应该选择 showme 的“下一个”类?

小提琴 - http://jsfiddle.net/QespX/

【问题讨论】:

    标签: jquery next


    【解决方案1】:

    .next():获取匹配元素集中每个元素的紧随其后的兄弟。如果提供了选择器,则仅当它与该选择器匹配时才会检索下一个兄弟。

    .nextAll():获取匹配元素集中每个元素的所有后续兄弟,可选地由选择器过滤。

    这就是你的方式

    $('.clickme').click(function() { 
        $(this).nextAll('.showme').slideDown();   //as clickme>showme
    });
    

    有关Tree Traversal 的更多信息可以在jQuery API 文档中找到。

    【讨论】:

      【解决方案2】:

      你可以使用.nextAll():

      $('.clickme').click(function() {
          $(this).nextAll('.showme').slideDown();
      });
      

      演示:http://jsfiddle.net/QespX/1/

      这有效的唯一原因是.showme.clickme 的兄弟。 .nextAll() 将在您单击的元素之后选择 所有.showMe 元素,但由于您只有一个,所以它会起作用。

      如果有问题,您可以使用.first() 缩小结果范围:

      $(this).nextAll('.showme').first().slideDown();
      

      【讨论】:

      • 啊哈,如果是这样的话,我可以用$(this).sibling('.showme') 代替吗?那会更理想吗?
      • @RCNeil:只有.siblings(),就像.nextAll(),但它是双向搜索。我真的不知道为什么 jQuery 的 .next() 没有像你期望的那样找到下一个元素。
      • 啊。非常感谢@Blender!实际上,由于会有更多的元素,所以在这种情况下,siblings() 似乎是更合适的选择器。欣赏答案!
      • 附注我标记另一个答案的唯一原因是因为我喜欢向不幸的人提供代表。您的回答确实为我的代码提供了所需的洞察力。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 2011-08-13
      相关资源
      最近更新 更多