I have an id for a You cannot have a To find the Based on the awesome answer by @mrtsherman, I wrote this more complete solution: Then you can use it as this: I would submit a PR for this on jQuery lib if I knew my code was properly optimized and if it was okay by Mr T Sherman there, meaning I think this should be a core method on jQuery! :P I thought this question was very interesting. It seems others are reading this as, find the next input among siblings. But I read it as - find me the next input no matter what. I don't know if its in a sibling, a parent or a parent's sibling. This is what I came up with based on feedback I received from this question. http://jsfiddle.net/GesSj/1 @Cawas - nice solution, but I suggest to use it not excessive, because of Regardless of that, I extended it for my needs: So if You can use "next":
Given the above, is it possible to find the next input:text
element regardless of any other mark up in
div
tag in between TR's
. It is not a valid markup.input
element from the referred tr
you can try this.$('#tagTR').nextAll().filter(function(){
return $(this).find('input:text').length > 1;
}).find('input');
Check it out: moved this into a more complete question and answer
(function( $ ){
$.fn.findNext = function(sel) {
var $result = $(sel).first();
if ($result.length <= 0) {
return $result;
}
$result = [];
var thisIndex = $('*').index($(this));
var selIndex = Number.MAX_VALUE; // Number.MAX_SAFE_INTEGER is not yet fully supported
$(sel).each(function(i,val){
var valIndex = $('*').index($(val));
if (thisIndex < valIndex && valIndex < selIndex) {
selIndex = valIndex;
$result = $(val);
}
});
return $result;
};
})( jQuery );
$('#tagTR').findNext('input');
//assume you know where you are starting from
var $startElement = $('#foo');
//get all text inputs
var $inputs = $('input[type=text]');
//search inputs for one that comes after starting element
for (var i = 0; i < $inputs.length; i++) {
if (isAfter($inputs[i], $startElement)) {
var nextInput = $inputs[i];
alert($(nextInput).val());
}
}
//is element before or after
function isAfter(elA, elB) {
return ($('*').index($(elA).last()) > $('*').index($(elB).first()));
}
$('*')
is expensive ;-)(function( $ ){
$.fn.findNextOverall = function(sel, returnItselfIfMatched) {
if(returnItselfIfMatched && $(this).is(sel)) return $(this);
var $result = $(sel).first();
if ($result.length <= 0) {
return $result;
}
$result = [];
var thisIndex = $('*').index($(this));
var selIndex = Number.MAX_SAFE_INTEGER;
$(sel).each(function(i,val){
var valIndex = $('*').index($(val));
if (thisIndex < valIndex && valIndex < selIndex) {
selIndex = valIndex;
$result = $(val);
}
});
return $result;
};
})( jQuery );
returnItselfIfMatched
is set true
it returns itself, if it matches the selector itself. Useful, if you don't know, which element is calling and you are searching for exactly itself.$("#tagTR").next("input")