#javascript #jquery
#javascript #jquery
Вопрос:
Допустим, у меня есть таблица, подобная этой, с несколькими выборками в каждой строке:
<table>
<tr>
<td>
<select name="selectA" id="selectA">
....
</select>
</td>
<td>
<select name="selectB" id="selectB">
....
</select>
</td>
<td>
<select name="selectC" id="selectC">
....
</select>
</td>
</tr>
<tr>
<td>
<select name="selectA2" id="selectA2">
....
</select>
</td>
<td>
<select name="selectB2" id="selectB2">
....
</select>
</td>
<td>
<select name="selectC2" id="selectC2">
....
</select>
</td>
</tr>
<tr>
<td>
<select name="selectA3" id="selectA3">
....
</select>
</td>
<td>
<select name="selectB3" id="selectB3">
....
</select>
</td>
<td>
<select name="selectC3" id="selectC3">
....
</select>
</td>
</tr>
</table>
Что я хочу сделать, так это то, что при изменении элемента select я хочу получить все элементы select в той же строке после измененного элемента select и также что-то изменить с ними.
Итак, если selectA изменится, я хочу получить selectB и selectC. Если selectB изменится, я хочу получить selectC. И так далее. Как это сделать с помощью jQuery?
Ответ №1:
Попробуйте это:
$('select').change(function() {
$(this).parent().nextAll().find('select')...
});
т.е. взять для элемента .parent()
(который будет <td>
), затем для всех его следующих братьев и сестер .nextAll()
, .find()
все <select>
элементы внутри них.
Ответ №2:
Существует множество плагинов jquery, которые облегчают создание каскадных выпадающих списков, чего, в двух словах, вы и хотите достичь.
Вот поиск в Google по «каскадному выпадающему jquery»; практически каждый результат является плагином jQuery 🙂
Комментарии:
1. Я хотел бы сделать это без плагина. Разве это невозможно с помощью nextUntil () или какой-либо другой функции? В принципе, что я хочу сделать, так это при изменении элемента select установить первый параметр как выбранный для всех элементов select после него в той же строке.
2. Что ж, похоже, вы вроде как знаете ответ на свой вопрос 🙂 Я не знал о
nextUntil()
, но это выглядит как хороший кандидат. У вас возникли проблемы с селектором jquery?3. Ну, да. Но я думаю, что я понял это. Я опубликовал ответ. Кажется, это работает.
Ответ №3:
Небольшая модификация решения Alnitak заключалась бы в том, чтобы вместо этого привязать обработчик событий на уровне таблицы, чтобы в итоге у вас была только одна функция, связанная с выполнением задания:
$('table').change(function(event) {
$(event.target).parent().nextAll().find('select')...
event.stopPropagation();
});
Ответ №4:
Это позволит получить все выборки, которые находятся в одной строке:
$("table select").change(function(){
var $select_mates=$('select', $(this).closest('tr'));
});
Если вам не нужен сам элемент:
$("table select").change(function(){
var $me=$(this);
var $select_mates=$('select', $me.closest('tr')).not($me);
});
Мое решение использует контекст выбора jQuery.
РЕДАКТИРОВАТЬ: Теперь я понял, что не видел after a current select element
:). Давайте посмотрим:
$("table select").change(function(){
var $me=$(this);
var $select_mates=$('select', $me.closest('tr'));
var $select_after_mates=$select_mates.slice($select_mates.index($me) 1);
});
Ответ №5:
Хорошо, это работает, я, наконец, понял, как это сделать:
$("table select").change(function(){
$(this).parent().nextUntil().find("select option:first").attr("selected", "selected");
});
Комментарии:
1. Разве селектор не должен использоваться в качестве
nextUntil()
параметра? зачем лишнееfind
?2. технически вы хотите,
.nextAll()
а не.nextUntil()
, хотя версия последнего без аргументов эквивалентна — смотрите Мой ответ.3. Это означает, что каждая выборка будет привязана к обработчику событий. Я бы предпочел привязать прослушиватель к элементу tr, а затем сопоставить следующие выборки, используя свойство event.target .
Ответ №6:
я бы попробовал что-то вроде
//"obj" being your <select> HTML element
jQuery(obj).parent().find("select").not(obj);
Обновить
Я знаю, что ответ уже есть, но я подумал, что для полноты картины я бы добавил исправление:
//"obj" being your <select> HTML element
// .parent().parent() gets the row
// .find("select" finds all the selects contained somewhere in that row.
// .not(obj) removes your current <select>
jQuery(obj).parent().parent().find("select").not(obj);
Комментарии:
1. Это позволит найти только
select
s в том же самомtd
.2. Ах, ваше право, я должен был сначала искать родительский
<tr>
элемент!.