이벤트는 무언가 일어났다는 신호 !
예를 들면, 사용자가 클릭했을 때
, 스크롤을 했을 때
, 필드의 내용을 바꾸었을 때
와 같은 것을 의미.
모든 DOM 노드
는 이런 신호를 만들어 낸다.
+ 이벤트는 DOM에만 한정되진 않는다.
click
: 객체를 클릭한 경우dblclick
: 더블 클릭한 경우blur
: 객체에 focus가 벗어날 경우focus
: 객체에 focus가 되었을 경우change
: 객체의 내용이 바뀌고 focus를 잃었을 경우select
: select option 등 객체를 선택할 경우load
: 문서나 객체가 로딩 되었을 경우mouseover
: 커서가 객체 위로 올라왔을 경우mouseout
: 커서가 객체 밖으로 나간 경우submit
: <form>
을 제출할 때 발생keyup
: 키보드 키를 눌렀다 뗀 경우keydown
: 키보드 키를 누를 경우error
: 에러가 발생한 경우scroll
: 스크롤 바를 조작하는 경우이벤트에 반응하려면 이벤트가 발생했을 때 실행되는 함수인 핸들러 handler를 할당해야 한다.
핸들러는 사용자의 행동에 어떻게 반응할 지를 자바스크립트 코드로 표현한 것 !
핸들러는 여러 가지 방법으로 할당할 수 있다.
<button type="button" onclick="alert('클릭!')">submit</button>
버튼을 클릭하면 onclick
안의 코드가 실행된다.
인라인
방식은 태그에 이벤트가 포함되기 때문에 이벤트의 소재를 파악하는 것이 편리하다.
하지만 정보인 HTML과 제어인 JavaScript가 혼재된 형태이기 때문에 바람직한 방법이라고 할 수는 없다.
이벤트 대상에 해당하는 객체의 프로퍼티로 이벤트를 등록하는 방식.
HTML과 javascript를 분리할 수 있다는 점에서 선호되는 방식이지만,
addEventListener를 사용하자.
<button type="button" id="btn">submit</button>
<script>
btn.onclick = function () {
alert('클릭!');
};
</script>
1.
<!----- 올바른 방법 ----->
button.onclick = sayHello;
// 틀린 방법
button.onclick = sayHello();
sayHello()
같이 괄호를 덧붙이는 것은 함수를 호출하겠다는 것을 의미한다.
sayHello()를 프로퍼티에 할당하면 함수 호출의 결과값(result)이 할당이 된다.
함수 sayHello
가 아무 것도 반환하지 않는다면 onclick
프로퍼티엔 undefined
이 할당되므로 이벤트가 원하는 대로 동작하지 않는다.
2.
DOM 프로퍼티는 대,소문자를 구분한다.
핸들러 할당할 시 btn.onclick
은 가능하지만, btn.ONCLICK
/ btn.onClick
은 안된다.
3.
setAttribute
로 핸들러를 할당하지 말자.
// body 클릭하면 에러 발생 !
// 속성은 항상 문자열이기 때문에 , 함수가 문자열이 되어버린다.
document.body.setAttribute('onclick', function() { alert(1) });
addEventListener
은 이벤트를 등록하는 가장 권장되는 방식.
여러 개의 이벤트 핸들러를 등록할 수 있다.
element.addEventListener(event, handler, [options]);
event
: 이벤트 이름handler
: 핸들러 함수options
: 아래 프로퍼티를 갖는 객체once
: true면 이벤트가 트리거 될 때 리스너가 자동으로 삭제됨.capture
: 어느 단계에서 이벤트를 다뤄야 하는 지를 알려주는 프로퍼티.passive
: true면 리스너에서 지정한 함수가 preventDefault()
를 호출하지 않음.element.removeEventListener(event, handler, [options]);
핸들러 삭제는 removeEventListener