#jquery #html
#jquery #HTML
Вопрос:
Я пытаюсь создать кнопку «только» для меню флажков, которая снимала бы все флажки (в каждом меню), кроме ближайшего флажка.
У меня есть некоторый код, который работает, но это своего рода хак, и вместо этого я хотел бы сказать в 1 строке что-то вроде:
- если $(this).closest(‘.checkbox’).find(‘input’)
checked
, то снимите флажок, иначе оставьте как есть
Кроме того, мне нужно, чтобы событие запускалось при фактическом нажатии пользователя (это с triggerHandler
)?
$('.only').on('click', function() {
$(this).closest('.checkbox').find('input').prop('checked', false);
$(this).closest('.row').find('input').prop('checked', true);
$(this).closest('.checkbox').find('input').prop('checked', false);
$(this).closest('.row').find('input').trigger('click');
});
.only {
border: 1px solid rgb(115, 135, 156);
float: right;
border: 1px;
border-radius: 5px;
padding-right: 7px;
padding-left: 7px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="checkbox">
<div class="row">
<div class="right">
<div class="only">only</div>
</div>
<label>
<input name="countryOriginMenu" value="Not provided" checked="checked" type="checkbox">
<span>Frist</span>
</label>
</div>
<div class="row">
<div class="right">
<div class="only">only</div>
</div>
<label>
<input name="countryOriginMenu" value="Not provided" checked="checked" type="checkbox">
<span>Second</span>
</label>
</div>
<div class="row">
<div class="right">
<div class="only">only</div>
</div>
<label>
<input name="countryOriginMenu" value="Not provided" checked="checked" type="checkbox">
<span>Third</span>
</label>
</div>
</div>
Ответ №1:
Вы запускаете неправильное событие, используйте изменение, чтобы удалить дублирующуюся строку. ПРИМЕЧАНИЕ: ЕСЛИ вы нажмете «щелчок», это изменит значение, а «изменить» — нет.
$('.only').on('click', function() {
$(this).closest('.checkbox').find('input[type="checkbox"]').prop('checked', false);
$(this).closest('.row').find('input[type="checkbox"]').prop('checked', true).trigger('change');
});
С другой стороны, вы НЕ можете изменить текущее значение, независимо от его значения (ЕДИНСТВЕННОГО) с:
$('.only').on('click', function() {
var cb = $(this).closest('.checkbox').find('input[type="checkbox"]');
var me = $(this).closest('.row').find('input[type="checkbox"]');
cb.not(me).prop('checked', false);
me.trigger('change');
});
ИЛИ выполните триггер для ДРУГИХ флажков: (поскольку они меняются)
cb.not(me).prop('checked', false).trigger('change');
Ответ №2:
При нажатии:
- Проверьте текущую кнопку на случай, если это не так.
- Снимите все флажки, кроме текущего.
Смотрите этот jsfiddle: https://jsfiddle.net/4bjtuunr/5 /
$('.only').on('click', function() {
var $current = $(this).closest('.row').find('input');
var $cbxs = $(this).closest('.checkbox').find('input');
$current.prop('checked', true);
$cbxs.not($current).prop('checked', false);
});
Комментарии:
1. Как я упоминал в OP, мне нужно выбрать / отменить выбор условно. Одна из причин заключается в том, что у меня появляется сообщение об ошибке, которое срабатывает, если флажки не выбраны.
2. Боюсь, я не понимаю, что вы имеете в виду. В вашем примере условия говорится: «если флажок установлен: снимите флажок, в противном случае оставьте непроверенным». Зачем вам условное условие, в этом случае результат будет таким же?
3. Правильно, это не то, что делает ваше (и мое) решение. Я также указал, что мне нужно имитировать щелчок пользователя, поскольку у меня есть панель мониторинга, где флажок является фильтром, и пересчет не запускается, если не происходит событие щелчка. Я не знаком с jQuery, но, насколько я понимаю, это
prop('checked', true)
изменяет только внешний вид кнопки.4. Я понимаю. При нажатии «только», если текущий флажок снят, он должен оставаться непроверенным? Кроме того, вы можете прослушивать событие изменения вместо события триггерного нажатия. Другой вариант — вызвать общую функцию обратного вызова для обоих событий.
5. Нет, кнопка «только» должна сохранять / изменять
checked
только соответствующий флажок. И ни в какой момент времени мне не разрешено устанавливать нулевые флажки.
Ответ №3:
Как насчет использования этого. Это может помочь вам поддерживать текущее состояние флажка без слишком большого количества условий для проверки.
var row = $(this).parents(".row");
row.siblings().find('input').prop('checked', false);
row.find('input').prop('checked', true);
Комментарии:
1.
$($(this).parents(".row")).siblings()
может быть просто$(this).parents(".row").siblings()
возможно?2. С вашей НОВОЙ строкой
var r= $(this).parents(".row"); r.siblings()
иr.find(
позволяет избежать двойного процесса dom3. Для этого и нужен этот сайт 🙂 Кстати, мне нравятся братья и сестры