2011-06-14 3 views
22

현재 응용 프로그램을 jQuery 1.6.1 (이전 1.4.4)을 사용하도록 업그레이드 중이므로 .click() 이벤트가 자동으로 .change() 이벤트를 트리거하는 것으로 나타났습니다. 당신이 .change() 기능이 .click() 이벤트가 발생하지 불 때 1.4.4을 포함하는 경우 http://jsfiddle.net/wDKPN/jQuery .change() 이벤트가 최신 버전에서 .click()으로 트리거됩니까?

주의 사항 :

나는 여기에 간단한 예제를 만들었습니다. 그러나 1.6으로 전환 할 때 .click()이 발생하면 .change() 이벤트 입니다.

두 질문 :

  1. 이 버그인가요?.click()을 프로그래밍 방식으로 트리거하면도 다른 이벤트를 발생시키지 않아야합니다 (예 : 사용자의 클릭을 "모방"하는 데 도움이되도록 .blur().focus()도 자동으로 실행되는 것이 잘못된 것 같습니다). 적절한 change() 이벤트 을 결합하는 저를위한 방법으로 다음 트리거 모두는 그 요소의 click()change() 이벤트

  2. 무엇입니까? 간단히 .click()으로 전화를 걸고 .change()도 실행됩니까? 내 예전의 코드에서

    $('#myelement').change(function() { 
        // do some stuff 
    }); 
    
    $('#myelement').click(); // both click and change will fire, yay! 
    

나는 아약스 호출 후에 몇 가지 체크 박스 (및 점검 상태와 값을) 초기화하는이 패턴을 사용하고 있습니다 :

$('#myelement').change(function() { 
     // do some stuff including ajax work 
    }).click().change(); 

그러나 1.6.1에서 내 논리는 두 번 발생합니다 (.click()에 한 번, .change()에 한 번). .change() 방아쇠를 제거하는 것에 의존 할 수 있습니까? jQuery가 이후 버전에서도 계속 이와 같은 방식으로 작동하기를 바랍니다.

+1

, 나는 그것을 부를 것이다 ''버그 '보다. 체크 박스를 클릭하면 상태가 변경되므로 결과적으로 변경 이벤트를 트리거 할 수있는 완전히 유효한 이유가 있습니다. 내게 그것은 이전에 그렇게하지 않았다는 것이 이상하다. (그리고 [그 스레드가있다] (http://stackoverflow.com/questions/2161213/why-is-onchange-on-a-checkbox-not-fired) - 체크 박스가 간접적으로 변경된 경우). – mkilmanas

+0

분명히, 나는 이것이 의도적이고 아마도 버그가 아니라는 것에 동의 할 수 있다고 생각합니다. 나는 그것이 업그레이드를 위해 이런 식으로 머물러 있기를 바란다. .. 그리고 우리는 그 다음에 다른 사건들에 대해 논할 수 없는가? 예를 들어, "사용자가 ** 체크 박스를 클릭하면 ** 변경해야합니다 **"라고 말하면됩니다. "사용자가 ** 체크 박스를 클릭하면 ** 포커스를 받아야합니다 **"라고 말할 수 있습니까? 그러나 .focus() 이벤트는 .click() .change()가 자동으로 실행되지 않습니다. –

+0

흥미로운 사실, yopu는 checkbox/jQuery 및 이벤트 체인을 사용하여 이상한 동작을 기억하면서 IE (6?)에 대한 몇 가지 테스트를 수행 했습니까? 의사가 ".triggerHandler() 메서드로 인해 이벤트 제출의 기본 동작 (예 : 양식 제출)이 발생하지 않습니다."라고 말한 것처럼 triggerHandler ('클릭')도 확인 했습니까? 이제 실행을 변경 하시겠습니까? – regilero

답변

3

가장 좋은 방법은 다음과 같습니다

$('#myelement').bind('initCheckboxes change', function() { 
    // do some stuff including ajax work 
}).trigger('initCheckboxes'); 

이렇게하려면 당신의 초기화 물건은 당신이 단지에 처음에게 페이지가로드를 실행할 사용자 정의 이벤트를 바인딩합니다. 이것은 아무도 어떤 버전에서든 당신을 떠날 것입니다.

change 이벤트가 오랜 시간 동안 있었기 때문에 나는 모든 버전에서 계속 그럴 것이라고 믿습니다. 그런 식으로 멋지게 작동합니다.

마지막으로 사용자 정의 이벤트 initCheckboxes이 페이지로드시 한 번만 실행되고 change 이벤트는 항상 변경 상태를 수신하고 실행하므로 해피 엔딩 스토리입니다.

+0

굉장합니다. 나는 큰 그림을 생각하기에 너무 깊었다. 이것은 또한 IE7/8이 다른 모든 것보다 다르게 동작한다는 사실을 해결합니다. 마지막으로, 내 HTML에서 checked = "checked"로 내 체크 박스를 만들려고합니다. (즉, .check()는 자동으로 .click()을 호출하는 것을 멈추기로 결정한 것입니다. init에서는 "checked"로 표시 될 것입니다 (내 의견을 아래의 @kwicher로 변경). –

+0

triggerHandler는 대부분의 상황에서 더 좋을 수 있습니까? http://api.jquery.com/triggerHandler vs .http://api.jquery.com/trigger –

1

jQuery 1.4.4 및 1.6 구현 모두에서 click 핸들러 내에 change()를 넣은 다음 클릭을 트리거 할 수 있다고 생각합니다.

$('.myelement').click(function(){ 
$('.myelement').change(); 
alert($(this).val()); 
}); 
$('.myelement').trigger('click'); 

예를 들어 there을보십시오. 이 작업을 수행하는

+0

이것은 내가 사용한 간단한 사용 사례 일 수도 있지만 ... .change() 이벤트에 바인딩하는 목적 .click() 이벤트 내부와 .change() 이벤트가있을 때 체크 박스 자체의 ** 상태 **가 다른 것입니다. 또 다른 예제를 만들었습니다 : http://jsfiddle.net/hLVaC/1/ (클릭 이벤트 내에서 체크 박스의 실제 상태는 프로그래밍 방식으로 호출되었을 때 아직 업데이트되지 않으며 제 경우에는 아약스를 사용하고 있습니다 초기화시 확인란 선택 상태를 동적으로 결정하기위한 호출). –

+0

이것은'change' 이벤트를 끝없이 첨부 할 것입니다. – Shef

+0

@Shef - 정확함, 방금 내 샌드 박스 테스트에 나타났습니다. –

2

나는 이것이 jQuery 1.4.4의 버그라고 말할 것이다. jQuery 이벤트 핸들러를 제거하고 표준 addEventListener을 사용하면 jquery 1.6.1과 동일한 결과가 생성됩니다.

window.count = 0; 

document.getElementById('mycheckbox').addEventListener('change', function() { 
    window.count++; 
    jQuery('#output').append('I fired: ' + window.count + ' times<br />'); 
}); 

document.getElementById('mycheckbox').click(); 

http://jsfiddle.net/jruddell/wDKPN/26/

또한 나는 특별히 jQuery를 이벤트 핸들러를 호출 triggerHandler을 사용합니다. 이벤트 모델에서 호출 할 처리기를 결정하려면 click, change 등을 사용하십시오.

2

확인란의 클릭 이벤트는 잊어 버리십시오. change 이벤트는 모든 것을 처리합니다.

$('#myelement').change(function() { 
    // do some stuff 
}); 
$('#myelement').trigger('change'); 

자신에 대한 참조 : http://jsfiddle.net/zupa/UcwdT/ 가 (이 데모는 jQuery를 1.8로 설정하지만,뿐만 아니라 1.6에서 작동합니다.)이 더 '수정

이 매우 좋은 관측 비록
관련 문제