ajax나 innerHTML을 통해서 새로운 엘리먼트가 추가되면 이전에 걸려있던 이벤트 핸들러가 깨짐.
아래와 같이 했을 경우,
모든 <a 엘리먼트를 클릭했을 때 'a click!' 이라는 alert창이 뜨는 걸 기대한다.
처음에는 잘 되지만 btn_test라는 버튼을 클릭하고 새 <a 를 추가하면 그때부터 모든 click 이벤트 핸들러가 동작을 하지 않는다.
$(document).ready(function() {
$('a').click(function() {alert('a click!')});
$('#btn_test').click(function(){
$('#cont').html($('#cont').html()+'<br/><a href="#">bbbb</a>');
});
});
$('a').click(function() {alert('a click!')});
$('#btn_test').click(function(){
$('#cont').html($('#cont').html()+'<br/><a href="#">bbbb</a>');
});
});
이것은 아래와 같은 방법으로 해결할 수 있다.
1. Re-binding
2. Use the Live Query Plugin
참고: http://docs.jquery.com/Frequently_Asked_Questions#Why_do_my_events_stop_working_after_an_AJAX_request.3F
플러그인은 뭐 좀 귀찮아서 싫고, Re-binding 방식은 말 그대로 한 번 더 이벤트 핸들러를 걸어주는 방식이다.
위의 예제를 변형하자면 아래처럼 바꾸면 제대로 동작한다.
$(document).ready(function() {
// 이벤트 핸들러 함수를 따로 빼놓음
function a_click() {alert('a click!');}
// onload 시 따로 빼놓은 함수를 걸어둠
$('a').click(a_click);
// 새 <a 엘리먼트 추가
$('#btn_test').click(function() {
$('#cont').html($('#cont').html()+'<br/><a href="#">bbbb</a>');
// 한 번 더 이벤트 핸들러를 걸어 줌
$('a').click(a_click);
});
});
// 이벤트 핸들러 함수를 따로 빼놓음
function a_click() {alert('a click!');}
// onload 시 따로 빼놓은 함수를 걸어둠
$('a').click(a_click);
// 새 <a 엘리먼트 추가
$('#btn_test').click(function() {
$('#cont').html($('#cont').html()+'<br/><a href="#">bbbb</a>');
// 한 번 더 이벤트 핸들러를 걸어 줌
$('a').click(a_click);
});
});
'JavaScript' 카테고리의 다른 글
[jQuery] ajax 간단 예제 (0) | 2010.03.04 |
---|---|
[jQuery] jQuery에서 outerHTML 가져오기 (0) | 2010.03.02 |
[jQuery] datepicker (2) | 2010.02.24 |
[JavaScript] 브라우저가 canvas를 지원하는지 체크 (0) | 2010.02.12 |
[JavaScript] 10진수, 16진수 변환 (0) | 2010.01.11 |