#javascript #jquery #html #checkbox #html-table
#javascript #jquery #HTML #флажок #html-таблица
Вопрос:
Я не уверен, почему этот jquery не работает. То, что я хочу, довольно просто: установить все флажки в регионе. Может кто-нибудь помочь объяснить, почему это не работает?
$(function(){
$('.select_all').change(function() {
var checkthis = $(this);
var checkboxes = $(this).next('tbody').find('.region_ct');
if(checkthis.is(':checked')) {
checkboxes.attr('checked', true);
} else {
checkboxes.attr('checked', false); }
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table class="table">
<tr>
<th colspan=2>Americas</th>
</tr>
<tr>
<td colspan=2><input type="checkbox" name="region_am_all" class="select_all" value="X" /> Select All</td>
</tr>
<tbody>
<tr>
<td><input type="checkbox" class="region_ct" value="X" /> Argentina</td>
<td class="center"></td>
</tr>
<tr>
<td><input type="checkbox" class="region_ct" value="X" /> Barbados</td>
<td class="center"></td>
</tr>
</tbody>
<tr>
<th colspan=2>Asia</th>
</tr>
...
</table>
Комментарии:
1.
tbody
не является ли следующий брат или сестра в любом случае.select_all
флажком2. о, если да, то как найти следующий tbody сразу после select_all
Ответ №1:
Там есть несколько проблем:
-
Я бы настоятельно рекомендовал не смешивать
tr
иtbody
элементы. Если вы собираетесь использоватьtbody
(и вы должны), используйте его последовательно. Браузеры могут перемещатьtr
элементы в сгенерированныеtbody
элементы. -
У элемента, к которому вы обращаетесь
next
, нет следующего родственного элемента (вообще, а тем более того, который вы ищете). Вы должны пройти вверх по иерархии доtr
(если вы не исправите # 1) илиtbody
(если исправите). -
Вы не используете
attr
для установкиchecked
, вы используетеprop
; и вы можете использовать свое существующееchecked
логическое значение, а неif/else
, предоставление простоcheckboxes.prop("checked", this.checked);
Пример с обновленными tbody
s, и я добавил несколько стран в области Азии, чтобы продемонстрировать, что установлены только соответствующие флажки:
$(function() {
$('.select_all').change(function() {
var checkthis = $(this);
var checkboxes = $(this).closest('tbody').next().find('.region_ct');
checkboxes.prop("checked", this.checked);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table class="table">
<tbody>
<tr>
<th colspan=2>Americas</th>
</tr>
<tr>
<td colspan=2>
<input type="checkbox" name="region_am_all" class="select_all" value="X" />Select All</td>
</tr>
</tbody>
<tbody>
<tr>
<td>
<input type="checkbox" class="region_ct" value="X" />Argentina</td>
<td class="center"></td>
</tr>
<tr>
<td>
<input type="checkbox" class="region_ct" value="X" />Barbados</td>
<td class="center"></td>
</tr>
</tbody>
<tbody>
<tr>
<th colspan=2>Asia</th>
</tr>
<tr>
<td colspan=2>
<input type="checkbox" name="region_am_all" class="select_all" value="X" />Select All</td>
</tr>
</tbody>
<tbody>
<tr>
<td>
<input type="checkbox" class="region_ct" value="X" />China</td>
<td class="center"></td>
</tr>
<tr>
<td>
<input type="checkbox" class="region_ct" value="X" />Vietnam</td>
<td class="center"></td>
</tr>
</tbody>
</table>
Вы также можете подумать о том, чтобы поместить select_all
внутри то же tbody
самое с флажками, чтобы вы могли покончить с next
.
Комментарии:
1. спасибо за исправление кодов и объяснение! Очень признателен!
Ответ №2:
tbody
не является sibing of .select_all
. Вам нужно использовать .closest()
для выбора родительского элемента .select_all
и использовать .find()
для выбора .region_ct
в нем. Также вам не нужно использовать if/else
check/uncheck
флажок to. Установите this.checked
значение checked только для атрибута checkbox using .prop()
.
$('.select_all').change(function() {
$(this).closest('table').find('.region_ct').prop('checked', this.checked);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table class="table">
<tr>
<th colspan=2>Americas</th>
</tr>
<tr>
<td colspan=2><input type="checkbox" name="region_am_all" class="select_all" value="X" /> Select All</td>
</tr>
<tbody>
<tr>
<td><input type="checkbox" class="region_ct" value="X" /> Argentina</td>
<td class="center"></td>
</tr>
<tr>
<td><input type="checkbox" class="region_ct" value="X" /> Barbados</td>
<td class="center"></td>
</tr>
</tbody>
<tr>
<th colspan=2>Asia</th>
</tr>
</table>
Комментарии:
1. Я думаю, что цель в
next
том, что в других s будут другие, не связанные.region_ct
поляtbody
.