Я использую jQuery для создания настраиваемых переключателей, и у меня проблема. При нажатии на метку, связанную с радио, события щелчка запускаются дважды, если я нажимаю только на само радио, оно работает нормально (ну, на самом деле это не радио, которое я нажимаю, а div, который обертывает весь ввод и метку). Вот код:
HTML:
<div id="box">
<asp:RadioButtonList ID="RadioButtonList1" runat="server">
<asp:ListItem>RADIO1</asp:ListItem>
<asp:ListItem>RADIO2</asp:ListItem>
<asp:ListItem>RADIO3</asp:ListItem>
</asp:RadioButtonList>
</div>
JQuery:
<script type="text/javascript">
$(function () {
$('#box').find('input:radio').each(function (i) {
var input = $(this);
// get the associated label using the input's id
var label = $('label[for=' + input.attr('id') + ']');
// wrap the input + label in a div
$('<div class="custom-radio"></div>').insertBefore(input).append(label, input);
var wrapperDiv = input.parent();
// find all inputs in this set using the shared name attribute
var allInputs = $('input[name=' + input.attr('name') + ']');
// necessary for browsers that don't support the :hover pseudo class on labels
label.hover(
function () {
$(this).addClass('hover');
}, function () {
$(this).removeClass('hover checkedHover');
});
//bind custom event, trigger it, bind click,focus,blur events
wrapperDiv.bind('updateState', function () {
if ($(this)[0].children[1].checked) {
allInputs.each(function () {
var curDiv = $('div > label[for=' + $(this).attr('id') + ']').parent();
curDiv.removeClass('custom-radio-checked');
curDiv.addClass('custom-radio');
});
$(this).toggleClass('custom-radio custom-radio-checked');
}
else {
$(this).removeClass('custom-radio-checked checkedHover checkedFocus');
}
})
.trigger('updateState')
.click(function () { console.log('click'); })
.focus(function () {
label.addClass('focus');
}).blur(function () {
label.removeClass('focus checkedFocus');
});
});
});
</script>
Есть ли какое-нибудь решение для такого поведения?
jQuery('input').prop('checked', true);
return false;
эквивалентен `evt.stopPropagation (); evt.preventDefault (); ( в jQuery )Я попытался добавить решение выше, добавив:
но не сработало. Однако добавив это:
решил проблему! :)
источник
evt.stopPropagation(); evt.preventDefault();
неПривяжите событие щелчка к вводу, а не к метке. Когда метка нажата - событие все равно произойдет, потому что, как упоминал Дастин, щелчок по метке вызывает щелчок по вводу. Это позволит этикетке сохранить свою нормальную функциональность.
Вместо того
источник
change
даже к радиокнопке, поскольку текст метки кликабелен - они не всегда нажимают сам радиокнопку.label > input
настройку Bootstrapesque , это ответ, а не ответ. Добавлениеevt.stopPropagation()
илиevt.preventDefault()
в ваш код, хотя и является эффективным, - это хитрость, которой следует избегать, когда правильное решение намного чище и эффективнее.Если вы пытаетесь использовать внешний контейнер в качестве элемента щелчка, вы также можете позволить событиям всплывать естественным образом и проверить ожидаемый элемент в обработчике щелчка. Этот сценарий полезен, если вы пытаетесь создать уникальную зону щелчка для формы.
источник
if (e.target == e.currentTarget) {}
Чтобы исправить это простым способом, удалите атрибут «for» на этикетке. Щелчок по метке также вызовет щелчок по соответствующему элементу. (который в вашем случае дважды запускает событие click.)
Удачи
источник
Я обычно использую этот синтаксис
вместо того
источник
Лучший ответ скрыт внутри комментариев:
Эта скрипка показывает , что все остальные решения -
stopPropagation
,stopImmediatePropagation
,preventDefault
,return false
- либо изменить ничего или не уничтожить / функциональность радио флажка). Это также показывает, что это проблема обычного JavaScript, а не проблема jQuery.РЕДАКТИРОВАТЬ: Еще одно рабочее решение, которое я только что нашел в другом потоке, - это привязать
onclick
к вводу, а не к метке. Обновленная скрипка .источник
Я пробовал добавлять раствор.
но не сработало.
Добавляя
решил проблему! :)
источник
Проблема с e.preventDefault (); это останавливает щелчок метки от проверки переключателя.
Лучшим решением было бы просто добавить быструю проверку «проверено», например:
источник
Моя проблема немного в другом, так как у
evt.stopPropagation();evt.preventDefault();
меня не работает, я просто добавляюreturn false;
в конце, и это работает.источник
В моем случае проблема заключалась в том, что у меня было событие щелчка в функции, и функция была выполнена дважды .... каждое выполнение функции создает новое событие щелчка. - фейспалм -
после перемещения события щелчка за пределы функции все заработало, как ожидалось! :)
источник
Попробуйте поместить свой тег ввода за пределы элемента триггера, потому что тег метки имитирует щелчок, поэтому у вас всегда будет более одного вызова.
источник
У меня была такая же проблема, потому что я вложил свое радио внутри метки, как это, с обработчиком, прикрепленным к radio_div. Удаление вложенной метки устранило проблему.
источник
Ярлык вызывает установку флажка / переключателя.
Это предотвращает, особенно ярлык, чтобы вызвать это поведение.
источник
Щелчок по ярлыку с атрибутом for = "some-id" вызывает новый щелчок, но только если цель существует и является входом. Мне не удалось решить эту проблему с помощью e.preventDefault () или тому подобного, поэтому я сделал это так:
Например, если у вас есть эта структура и вы хотите, чтобы событие при нажатии на .some-class
Что действительно работало:
источник