[jquery] 레이블을 클릭하면 jQuery Click이 두 번 실행됩니다.

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>

이 동작에 대한 해결책이 있습니까?



답변

추가해보십시오 :

evt.stopPropagation();
evt.preventDefault();

.bind () 또는 .click ()에 표시됩니다. 또한 evt함수에 매개 변수 를 추가합니다.function(evt) {...


답변

다음을 추가하여 위의 솔루션을 추가해 보았습니다.

evt.stopPropagation();
evt.preventDefault();

하지만 작동하지 않았습니다. 그러나 이것을 추가 :

evt.stopImmediatePropagation();

문제를 해결했습니다! 🙂


답변

클릭 이벤트를 레이블이 아닌 입력에 바인딩하십시오. 레이블을 클릭 할 때-Dustin이 언급했듯이 레이블을 클릭하면 입력에 대한 클릭이 트리거되기 때문에 이벤트가 계속 발생합니다. 이렇게하면 레이블이 정상적인 기능을 유지할 수 있습니다.

$('input').click();

대신에

$('label').click();


답변

외부 컨테이너를 클릭 요소로 사용하려는 경우 이벤트가 자연스럽게 버블 링되도록하고 클릭 핸들러에서 예상되는 요소를 테스트 할 수도 있습니다. 이 시나리오는 양식에 대해 고유 한 클릭 영역의 스타일을 지정하려는 경우 유용합니다.

<form>
<div id="outer">
    <label for="mycheckbox">My Checkbox</label>
    <input type="checkbox" name="mycheckbox" id="mycheckbox" value="on"/>
</div>
</form>
<script>
$('#outer').on('click', function(e){
    // this fires for #outer, label, and input
    if (e.target.tagName == 'INPUT'){
        // only interested in input
        console.log(this);
    }
});
</script>


답변

이 문제를 쉽게 해결하려면 레이블에서 “for”속성을 제거하십시오. 라벨을 클릭하면 관련 요소도 클릭됩니다. (귀하의 경우 클릭 이벤트를 두 번 실행합니다.)

행운을 빕니다


답변

저는 보통이 신텍스를 사용합니다

.off('click').on('click', function () { console.log('click'); })

대신에

.click(function () { console.log('click'); })


답변

댓글 안에 베스트 답변이 숨겨져 있습니다.

change라벨의 텍스트를 클릭 할 수 있기 때문에 실제로 라디오 버튼에도 바인딩해야 합니다. 항상 라디오 버튼 자체를 클릭하지는 않습니다. – chovy 1시 45분에서 12월 12일 ’13

바이올린은 – 다른 모든 솔루션 것으로 보여 stopPropagation, stopImmediatePropagation, preventDefault, return false– 변경 아무것도 또는 중 하나)이 체크 박스 / 라디오 기능을 파괴하지 않습니다. 또한 이것이 jQuery 문제가 아니라 바닐라 JavaScript 문제임을 보여줍니다.

편집 :
방금 다른 스레드에서 찾은 또 다른 작업 솔루션 onclick은 레이블이 아닌 입력 에 바인딩하는 것입니다. 업데이트 된 바이올린 .