마우스를 이용해 버튼을 클릭하는 것과 같은 '이벤트'
이벤트 리스너: 이벤트가 발생했을 때 어떠한 액션을 위해 호출되는 함수
호출하기 위해서는 이벤트 리스너를 해당객체/요소에 등록해줘야 한다.
1) 자바스크립트 코드에서 프로퍼티로 등록
window.onload = function () {
// 문서가 load 될 때 이 함수 실행
let text = document.getElementById("text");
// 아이디가 "text"인 요소를 return
text.innerHTML = "HTML 문서 loaded";
}
2) HTML 태그에 속성으로 등록
<button onclick="alert('버튼이 클릭됐습니다.')">버튼입니다.</button>
3) addEventListener 메소드 사용
element.addEventListener(이벤트명, 실행할 함수명(listener), 옵션);
const aElement = document.querySelector('a');
aElement.addEventListener('click', () => {
alert('a element clicked');
});
이벤트가 발생할 때 '이벤트 객체'를 가져올 수 있다.
const buttonElement = document.querySelector('.btn');
buttonElement.addEventListener('click', handleClick);
function handleClick(event) {
let val;
val = event;
// Event target element
val = event.target;
val = event.target.id;
val = event.target.className;
val = event.target.classList;
// Event type
val = event.type;
// 윈도우로부터의 거리 좌표
val = event.clientY;
val = event.clientX;
// 요소로부터의 거리 좌표
val = event.offsetY;
val = event.offsetX;
console.log(val);
}
load: 문서나 객체가 로드 완료되었을 때 발생
change: 객체의 내용이 변동/focus를 잃었을 때 발생
resize: 객체의 크기가 바뀌었을 때 발생
scroll: 스크롤바를 조작할 때 발생
error: 에러가 발생되었을 때 발생
keydown: 키를 눌렀을 때 발생 (누르고 있으면 계속 실행)
keyup: 키를 눌렀다가 뗐을 때 발생
keypress: 사용자가 눌렀던 키의 문자가 입력되었을 때 발생 (한 번만 실행 = 사용자가 누른 키의 문자가 입력되었을 때 발생)
click: 객체를 클릭했을 때 발생
dbclick: 객체를 더블클릭했을 때 발생
mousedown: 마우스를 클릭했을 때 발생
mouseout: 마우스가 특정 객체 밖으로 나갔을 때 발생
mouseover: 마우스가 특정 객체 위로 올려졌을 때 발생
mousemove: 마우스가 움직였을 때 발생
mouseup: 마우스에서 손을 뗐을 때 발생
mousedown vw click
클릭 ➡️ mousedown ➡️ 마우스 놓음 ➡️ click
focus: 객체에 포커스 되었을 때 발생
blur: 객체가 포커스를 잃었을 때 발생
input: input, textarea 요소 값이 변경되었을 때 발생
change: 선택상자, 체크박스, 라디오 버튼 등의 상태가 변경되었을 때 발생
select: 텍스트를 선택했을 때 발생
reset: 리셋 버튼을 눌렀을 때 발생
submit: 사용자가 버튼키 등을 활용하여 폼을 전송할 때 발생
cut/copy/paste: 사용자가 폼필드의 콘텐츠를 잘라내기/복사/붙여넣기 할 때 발생
<form>FORM
<div>DIV
<p>P</p>
</div>
</form>
<script>
const form = document.querySelector('form');
const div = document.querySelector('div');
const p = document.querySelector('p');
form.onclick = function (event) {
event.target.style.backgroundColor = 'yellow';
// chrome needs some time to paint yellow
setTimeout(() => {
alert("target = " + event.target.tagName + ", this=" + this.tagName);
event.target.style.backgroundColor = ''
}, 0);
};
</script>
1) 캡처링 단계: 이벤트가 하위 요소로 전파되는 단계 (위에서 아래로)
2) 타킷 단계: 이벤트가 실제 타킷 요소에 전달되는 단계 (타킷에 이벤트 전달)
3) 버블링 단계: 이벤트가 상위 요소로 전파되는 단계 (아래에서 위로 다시 올라옴)
addEventLister의 capture옵션을 true로 설정하여 캡쳐링의 흐름을 확인할 수 있다.
html ➡️ body ➡️ FORM
<script>
for (let elem of document.querySelectorAll("*")) {
elem.addEventListener(
"click",
(e) => alert(`캡쳐링: ${elem.tagName}`),
true
);
elem.addEventListener("click", (e) => alert(`버블링: ${elem.tagName}`));
}
</script>
하위 요소의 이벤트를 상위에서 위임하는 것
= 하위 요소의 이벤트를 상위에서 제어하는 것
<body>
<div id="buttons">
<button class="buttonClass">Click me</button>
<button class="buttonClass">Click me</button>
</div>
<script>
// const buttons = document.getElementsByClassName("buttonClass");
// for (const button of buttons) {
// button.addEventListener("click", () => alert('clicked'));
// }
const buttons = document.getElementById("buttons");
buttons.addEventListener("click", () => alert('clicked'));
let buttonList = document.querySelector('#buttons');
let button = document.createElement('button');
button.setAttribute('class', 'buttonClass');
button.innerText = 'Click me';
buttonList.appendChild(button);
</script>
</body>