Jquery-найти следующий ввод: текстовый элемент после известного элемента
у меня есть id для <tr id="tagTR">
Учитывая вышеизложенное, можно ли найти следующий input:text
элемент независимо от любой другой отметки между ними . Есть селектор jQuery, который я могу использовать для этого сценария?
например :
<tr id="tagTR">
</tr>
<tr id="tagRed">
<td> </td>
</tr>
<div>
<tr>
<td>
<input> // This is what I want to get to.
</td>
</tr>
</div>
5 ответов
Я думал, что этот вопрос был очень интересным. Кажется, другие читают это как, найти следующий вход среди братьев и сестер. Но я читаю его как-найдите мне следующий вход, несмотря ни на что. Я не знаю, есть ли это у брата, родителя или родного брата. Это то, что я придумал на основе отзывов, которые я получил от этот вопрос.
//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()));
}
зацени: переехала на более полный вопрос и ответ
на основе удивительный ответ!--4--> by @mrtsherman, Я написал это более комплексное решение:
(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');
Я отправить PR для этого на jQuery lib, если бы я знал, что мой код был должным образом оптимизирован, и если бы это было хорошо г-ном т. Шерманом, что означает я думаю, что это должно быть ключевым способ на jQuery! : P
@Cawas - хорошо решение, но я предлагаю использовать его не чрезмерно, из-за $('*')
дорогая ;-)
несмотря на это, я расширил его для своих нужд:
(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
установлен true
он возвращает себя, если он соответствует самому селектору. Полезно, если вы не знаете, какой элемент вызывает, и вы ищете именно себя.
вы не можете иметь div
тег между TR's
. Это недопустимая разметка.
найти input
элемент из упомянутого tr
вы можете попробовать это.
$('#tagTR').nextAll().filter(function(){
return $(this).find('input:text').length > 1;
}).find('input');