Search code examples
javascriptjquerytraversal

get the next element with a specific class after a specific element


I have a HTML markup like this:

<p>
  <label>Arrive</label>
  <input id="from-date1" class="from-date calender" type="text" />
</p>

<p>
  <label>Depart</label>
  <input id="to-date1" class="to-date calender" type="text" />
</p>

<p>
  <label>Arrive</label>
  <input id="from-date2" class="from-date calender" type="text" />
</p>

<p>
  <label>Depart</label>
  <input id="to-date2" class="to-date calender" type="text" />
</p>

I want to get the next element after from dates to get the corresponding to date. (Layout is a little more complex but from date has from-date class and to date has to-date class).

This is I am trying to do, I want to take a from date element and find the next element in the dom with to-date class. I tried this:

$('#from-date1').next('.to-date')

but it is giving me empty jQuery element. I think this is because next gives the next sibling matching the selector. How can I get the corresponding to-date?


Solution

  • Couldn't find a direct way of doing this, so wrote a little recursive algorithm for this.

    Demo: http://jsfiddle.net/sHGDP/

    nextInDOM() function takes 2 arguments namely the element to start looking from and the selector to match.

    instead of

    $('#from-date1').next('.to-date')
    

    you can use:

    nextInDOM('.to-date', $('#from-date1'))
    

    Code

    function nextInDOM(_selector, _subject) {
        var next = getNext(_subject);
        while(next.length != 0) {
            var found = searchFor(_selector, next);
            if(found != null) return found;
            next = getNext(next);
        }
        return null;
    }
    function getNext(_subject) {
        if(_subject.next().length > 0) return _subject.next();
        return getNext(_subject.parent());
    }
    function searchFor(_selector, _subject) {
        if(_subject.is(_selector)) return _subject;
        else {
            var found = null;
            _subject.children().each(function() {
                found = searchFor(_selector, $(this));
                if(found != null) return false;
            });
            return found;
        }
        return null; // will/should never get here
    }