views:

6470

answers:

5

Hello,

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?)

+1  A: 

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);
Allain Lalonde
CLosest will also search upwards.
Pim Jager
+1  A: 

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

$(".counter").siblings("span");
Andrew Hare
Any reason for the downvote? This is the simplest solution to the problem.
Andrew Hare
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.
Allain Lalonde
Hmm, possibly. siblings() works for the example code he posted.
Andrew Hare
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.
Taryn East
A: 

Hi -

Try something like this:

$(".counter ~ span:first");

Hope that helps!

landyman
This will not work when you have somthing like: <div class='x'></div><p><span></span></p>. The span will not be matched.
Pim Jager
+1  A: 

I think you 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);
}
Pim Jager
A: 

$(".counter + span")