jQuery 체크 박스 이벤트 처리


136

나는 다음을 가지고있다 :

<form id="myform">
   <input type="checkbox" name="check1" value="check1">
   <input type="checkbox" name="check2" value="check2">
</form>

jQuery를 사용하여 발생 하는 모든 체크 이벤트 를 캡처하고 어떤 체크 myform박스가 토글되었는지 (및 토글되었는지 여부) 알 수 있습니까?

답변:


244
$('#myform :checkbox').change(function() {
    // this will contain a reference to the checkbox   
    if (this.checked) {
        // the checkbox is now checked 
    } else {
        // the checkbox is now no longer checked
    }
});

30
this이미 확인란의 DOM 요소로 설정되었으므로 this.checked충분합니다. 조작을 계획하지 않는 한 다른 jQuery 객체를 만들 필요가 없습니다.
Walf

18
작은 팁. : selectbox 대신 input : checkbox를 사용하면 성능이 향상됩니다. 후자는 범용 선택기 * : checkbox로 변환되기 때문입니다.
jimmystormig

23
아무 곳이나 클릭에 가까운 아닌 어떤 검사 이벤트.
Peter

27
이것이 최선의 방법은 아닙니다. 입력에 해당하는 레이블 (예 <label for='myInput'>Checkbox:</label><input id='myInput' name='myInput' type='checkbox'/>:)이 있고 레이블을 클릭하면 확인란이 선택되지만이 기능은 호출되지 않습니다. .change()이벤트를 사용해야합니다
Patrick

7
이 답변은 완전한 답변을 제공하지는 않습니다. 아래에서 Anurag의 답변을 참조하십시오.이 답변은 훨씬 더 정확하고 정확한 답변입니다. 이 답변은 물론 부분적으로는 정확하지만 명시된 바와 같이 정답은 아닙니다.
Carnix

131

변경 이벤트를 사용하십시오.

$('#myform :checkbox').change(function() {
    // this represents the checkbox that was checked
    // do something with it
});

5
확인란이 숨겨져 있으면 사용자가 해당 확인란과 상호 작용할 수 없습니다. 다른 의미가 있으면 알려주세요.
Anurag

1
이것은 해고되지 않습니다 $("input[name=check1]").prop('checked', true). 참조 jsfiddle.net/Z3E8V/2
피터

15
그것은 의도적으로 설계된 것입니다. 프로그래밍 방식으로 DOM 요소의 속성을 변경해도 관련 이벤트 처리기가 트리거되지 않습니다. 수동으로 발사해야합니다.
Anurag

6
선택한 답변이어야합니다. 확인란의 레이블을 클릭해야합니다.
Patrick

3
jQuery 문서에서 : " :checkboxjQuery 확장이며 CSS 사양의 일부가 아니기 때문에 쿼리를 사용 :checkbox하면 기본 DOM querySelectorAll()메소드가 제공하는 성능 향상을 활용할 수 없습니다 . 최신 브라우저에서 성능을 향상 시키 려면 [type="checkbox"]대신 사용하십시오."
NXT

54

몇 가지 유용한 답변이 있지만 모든 최신 옵션 을 다루지는 않습니다 . 이를 위해 필자의 모든 예제는 일치하는 label요소가 있는지 확인하고 확인란을 동적으로 추가하고 결과를 측면 패널에 표시합니다 (리디렉션 console.log).

  • 듣기 click에 행사하는 checkboxes것입니다 하지 그 키보드 토글 또는 일치하는 경우 변경 사항을 허용하지 않으므로 좋은 아이디어 label요소를 클릭했다. 항상 change이벤트를 청취하십시오 .

  • :checkbox대신 jQuery 의사 선택기를 사용하십시오 input[type=checkbox]. :checkbox더 짧고 읽기 쉽습니다.

  • is()jQuery :checked의사 선택기 와 함께 사용 하여 확인란이 선택되어 있는지 테스트합니다. 이것은 모든 브라우저에서 작동합니다.

기존 요소에 첨부 된 기본 이벤트 핸들러 :

$('#myform :checkbox').change(function () {
    if ($(this).is(':checked')) {
        console.log($(this).val() + ' is now checked');
    } else {
        console.log($(this).val() + ' is now unchecked');
    }
});

JSFiddle : http://jsfiddle.net/TrueBlueAussie/u8bcggfL/2/

노트:

  • 용도 :checkbox사용하는 것이 바람직하다 선택기를,input[type=checkbox]
  • 이벤트가 등록 될 때 존재하는 일치하는 요소 에만 연결 됩니다 .

상위 요소에 연결된 위임 된 이벤트 핸들러 :

위임 된 이벤트 핸들러는 요소가 아직 존재하지 않는 (동적으로로드되거나 생성 된) 상황에 맞게 설계되었으며 매우 유용합니다. 그들은 조상 요소 (따라서 용어)에 책임을 위임 합니다.

$('#myform').on('change', ':checkbox', function () {
    if ($(this).is(':checked')) {
        console.log($(this).val() + ' is now checked');
    } else {
        console.log($(this).val() + ' is now unchecked');
    }
});

JSFiddle : http://jsfiddle.net/TrueBlueAussie/u8bcggfL/4/

노트:

  • change변경되지 않는 조상 요소 ( 이 경우 )로 버블 링하는 이벤트 (이 경우 )를 수신하여 작동합니다.#myform .
  • 그런 다음 jQuery 선택기 ( ':checkbox'이 경우)를 버블 체인 의 요소에만 적용합니다. .
  • 그런 다음 이벤트 핸들러 기능을 이벤트를 일으킨 일치하는 요소에만 적용합니다.
  • 사용 document아무것도 가까이 / 편리한없는 경우 기본값으로는 위임 된 이벤트 핸들러를 연결합니다.
  • body마우스 이벤트 수신을 중지 할 수있는 버그 (스타일링 관련)가 있으므로 위임 된 이벤트를 첨부 하는 데 사용하지 마십시오 .

위임 처리기의 결과는 일치하는 요소 가 이벤트 처리기 등록 시가 아니라 이벤트 시간 에만 존재해야한다는 것 입니다. 이를 통해 동적으로 추가 된 컨텐츠가 이벤트를 생성 할 수 있습니다.

Q : 느려요?

A : 너무 오래 이벤트가 사용자 상호 작용의 속도로 한, 당신이에 대해 걱정할 필요가 없습니다 무시할 위임 된 이벤트 핸들러와 직접 연결된 처리기 사이의 속도 차이. 대표단의 이점은 사소한 단점보다 훨씬 큽니다. 위임 된 이벤트 핸들러는 일반적으로 단일 일치 요소에 연결 되므로 실제로 등록 하는 것이 더 빠릅니다 .


왜하지 않는 prop('checked', true)화재 change이벤트를?

이것은 실제로 의도적으로 설계된 것입니다. 이벤트가 시작되면 끝없는 업데이트 상황에 쉽게 빠질 수 있습니다. 대신 checked 속성을 변경 한 후 trigger(not triggerHandler)을 사용하여 변경 요소를 동일한 요소에 보냅니다 .

예. trigger사건이없는 경우

$cb.prop('checked', !$cb.prop('checked'));

JSFiddle : http://jsfiddle.net/TrueBlueAussie/u8bcggfL/5/

예를 trigger들어 정상적인 변경 이벤트가 잡히면

$cb.prop('checked', !$cb.prop('checked')).trigger('change');

JSFiddle : http://jsfiddle.net/TrueBlueAussie/u8bcggfL/6/

노트:

  • 위임 된 이벤트 핸들러에 triggerHandler이벤트를 버블 링하지 않으므로 한 사용자가 제안한대로 사용하지 마십시오 .

JSFiddle : http://jsfiddle.net/TrueBlueAussie/u8bcggfL/8/

그것은 비록 됩니다 이벤트 핸들러 작동 에 직접 연결 요소에 :

JSFiddle : http://jsfiddle.net/TrueBlueAussie/u8bcggfL/9/

.triggerHandler ()로 트리거 된 이벤트는 DOM 계층을 버블 링하지 않습니다. 대상 요소가 직접 처리하지 않으면 아무 것도 수행하지 않습니다.

참조 : http://api.jquery.com/triggerhandler/

이 기능이 적용되지 않는 추가 기능이있는 사용자는 추가 기능을 제안하십시오 .


31

jQuery (1.7)에서 새로운 'on'메소드 사용 : http://api.jquery.com/on/

    $('#myform').on('change', 'input[type=checkbox]', function(e) {
        console.log(this.name+' '+this.value+' '+this.checked);

    });
  • 이벤트 핸들러는 계속 작동합니다
  • 클릭이 아닌 키보드로 확인란을 변경하면 캡처됩니다.

1
이것은 해고되지 않습니다 $("input[name=check1]").prop('checked', true). 참조 jsfiddle.net/Z3E8V/2
피터

7
통화 .triggerHandler('change');후 추가 하면 .prop됩니다. 그런 다음 상자를 토글하고 이벤트를 호출합니다.
Hanna

5
$('#myform input:checkbox').click(
 function(e){
   alert($(this).is(':checked'))
 }
)

val()경우를 말하지 않는 checked것입니다 true.
Walf

5

asker가 jQuery를 구체적으로 요청했으며 선택한 답변이 정확하다는 사실을 인정하면이 문제에는 실제로 jQuery 가 필요 하지 않습니다 . 문제 없이이 문제를 해결 onClick하려면 다음과 같이 추가 기능을 추가하려는 확인란 의 속성을 설정하면됩니다 .

HTML :

<form id="myform">
  <input type="checkbox" name="check1" value="check1" onClick="cbChanged(this);">
  <input type="checkbox" name="check2" value="check2" onClick="cbChanged(this);">
</form>

자바 스크립트 :

function cbChanged(checkboxElem) {
  if (checkboxElem.checked) {
    // Do something special
  } else {
    // Do something else
  }
}

피들 : http://jsfiddle.net/Y9f66/1/


5
물론 이벤트 핸들러를 HTML에 직접 넣는 것은 물론입니다. 그러나 그것은 DRY 및 점진적 향상 방법론과 직접 충돌합니다. 보다 정확한 대답은 "이벤트 핸들러를 추가하기 위해 jQuery가 필요하지 않다"는 것입니다. 대신 표준 JS를 사용하여 클릭 핸들러를 HTML에 onclick 속성을 넣는 대신 별도의 JS 파일에 첨부하십시오. "작동"하지만 좋은 코딩 방법을 사용하면 가능할 때 피해야합니다 (IE6 등을 지원하지 않으면 MS가 더 이상하지 말아야하는 경우가 아니면 거의 항상이 시점에 있음)
Carnix

3

첫 번째 답변에서 코드를 사용해 보았습니다. 작동하지 않지만 놀았습니다.

$('#vip').change(function(){
    if ($(this).is(':checked')) {
        alert('checked');
    } else {
        alert('uncheck');
    }
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.