Find the next element that is not immediate?

27,255

Solution 1

I think your method is the best way. And if you feel it doesn't look good just turn it into a plugin:

jQuery.fn.firstAfter = function(filter){
 return this.nextAll(filter).eq(0);
}

Solution 2

Similar to the marked answer but looks a little cleaner using the :first selector:

$('.counter').nextAll('span:first')

Solution 3

I think the siblings() function is what you are looking for. Try something like this:

$(".counter").siblings("span");

Solution 4

I'm not sure that the closest method will do the trick, but if so... maybe you can extract the closest method from 1.3 and turning it into a plugin?

I haven't had a chance to try this, but give it a shot. It can't hurt:

(function($) {
  $.fn.closest = function (selector) {
    return this.map(function(){
      var cur = this;
      while ( cur && cur.ownerDocument ) {
        if ( $(cur).is(selector) )
          return cur;
        cur = cur.parentNode;
      }
    });
  }
})(jQuery);
Share:
27,255
Logan Serman
Author by

Logan Serman

Updated on July 09, 2022

Comments

  • Logan Serman
    Logan Serman almost 2 years

    I want to find the first span element after class counter, in code something like this:

    <div class="counter"></div>
    <p></p>
    <span></span>
    

    It seems like the next() function only finds the immediate next element, so something like this:

    $(".counter").next("span")
    

    Won't work. The way I have been using is a bit lengthy and I was wondering if there was a shorter way, it is this:

    $(".counter").nextAll("span").eq(0)
    

    I think the closest() method in jQuery 3 will do the trick, but I am using 1.2.6 -- is there a better way to do this (am I just using next() wrong?)

  • Andrew Hare
    Andrew Hare over 15 years
    Any reason for the downvote? This is the simplest solution to the problem.
  • Allain Lalonde
    Allain Lalonde over 15 years
    I didn't downvote, but doesn't this only find you elements that are immediate siblings to the .counter one. I think he wants the next on in the page as though we were looking at the source code.
  • Andrew Hare
    Andrew Hare over 15 years
    Hmm, possibly. siblings() works for the example code he posted.
  • Pim Jager
    Pim Jager about 15 years
    CLosest will also search upwards.
  • Pim Jager
    Pim Jager about 15 years
    This will not work when you have somthing like: <div class='x'></div><p><span></span></p>. The span will not be matched.
  • Taryn East
    Taryn East almost 14 years
    Won't siblings take the first of the siblings that matches... which may be before the current element? I think the solution needed here is to exclude all siblings before the current element and only match the first sibling after the current.