[JS] 브라우저 이벤트

룽지·2022년 6월 7일
0

JavaScript

목록 보기
7/8

이벤트

  • 이벤트(event) : 무언가 일어났다는 신호
    • 모든 DOM 노드는 이런 신호를 만듦

자주 사용되는 유용한 DOM 이벤트

마우스 이벤트

  • click : 요소 위에서 마우스 왼쪽 버튼 눌렀을 때 발생
  • contextmenu : 요소 위에서 마우스 오른쪽 버튼을 눌렀을 때 발생
  • mouseover, mouseout : 마우스 커서를 요소 위로 움직였을 때, 커서가 요소 밖으로 움직였을 때 발생
  • mousedown, mouseup : 요소 위에서 마우스 왼쪽 버튼을 누르고 있을 때, 마우스 버튼을 뗄 때 발생
  • mousemove : 마우스를 움직일 때 발생

폼 요소 이벤트

  • submit : 사용자가 <form>을 제출할 때 발생
  • focus : 사용자가 <input>과 같은 요소에 포커스할 때 발생

키보드 이벤트

  • keydown과 keyup : 사용자가 키보드 버튼을 누르거나 뗄 때 발생

문서 이벤트

  • DOMContentLoaded : HTML이 전부 로드 및 처리되어 DOM 생성이 완료되었을 때 발생

CSS 이벤트

  • transitionend : CSS 애니메이션이 종료되었을 때 발생

이벤트 핸들러

  • 이벤트에 반응하려면 이벤트가 발생했을 때 실행되는 함수인 핸들러(handler)를 할당

HTML 속성

  • HTML 안 on<event> 속성에 핸들러를 할당할 수 있음
<input value="클릭해 주세요." onclick="alert('클릭!')" type="button">
  • input 태그의 onclick 속성에 click 핸들러 할당
  • 긴 코드를 HTML 속성값으로 사용하는 것은 추천하지 않음
    • 만약 코드가 길다면, 함수를 만들어서 이를 호출하는 방법

함수 만들어서 호출

<script>
  function countRabbits() {
    for(let i=1; i<=3; i++) {
      alert(`토끼 ${i}마리`);
    }
  }
</script>

<input type="button" onclick="countRabbits()" value="토끼를 세봅시다!">

대소문자 구분하지 않음

  • ONCLICK = onClick = onclick
  • 하지만 거의 속성값은 소문자로 작성 => onclick

DOM 프로퍼티

  • on<event>을 사용해도 핸들러를 할당할 수 있음
  • elem.onclick을 사용한 예시)
<input id="elem" type="button" value="클릭해 주세요.">
<script>
  elem.onclick = function() {
    alert('감사합니다.');
  };
</script>
  • 핸들러를 HTML 속성을 사용해 할당하면, 브라우저는 속성값을 이용해 새로운 함수를 만듦
    • 생성된 함수를 DOM 프로퍼티에 할당
  • 따라서, DOM 프로퍼티를 사용해 핸들러를 만든 예시와 HTML 속성을 사용해 만든 예시는 동일하게 작동

동일하게 작동되는 예시

    1. HTML만 사용하는 방법
<input type="button" onclick="alert('클릭!')" value="클릭해 주세요.">
    1. HTML과 자바스크립트를 함께 사용하는 방법
<input type="button" id="button" value="클릭해 주세요.">
<script>
  button.onclick = function() {
    alert('클릭!');
  };
</script>

onclick 프로퍼티는 하나만 할당 가능

  • 복수의 이벤트 핸들러를 할당할 수 없음
  • 핸들러를 하나 더 추가하면, 기존 핸들러는 덮어씌워짐
<input type="button" id="elem" onclick="alert('이전')" value="클릭해 주세요.">
<script>
  elem.onclick = function() { // 기존에 작성된 핸들러를 덮어씀
    alert('이후'); // 이 경고창만 보입니다.
  };
</script>
  • '이후' 내용의 alert창이 뜸
  • 핸들러 제거 : elem.onclick = null 같이 null 할당

this로 요소에 접근

  • 핸들러 내부에 쓰인 this의 값은 핸들러가 할당된 요소
  • this.innerHTML
    • this = button이므로 버튼 안의 내용이 얼럿창에 출력
<button onclick="alert(this.innerHTML)">클릭해 주세요.</button>

자주 하는 실수

onclick에 함수 할당

  • 이미 존재하는 함수를 직접 핸들러에 할당하는 예시
function sayThanks() {
  alert('감사합니다!');
}

elem.onclick = sayThanks;
  • 함수는 sayThanks 처럼 할당해야 함
    • sayThanks() 할당하면 동작하지 않음
      • 괄호를 덧붙이는 것 = 함수 호출
      • sayThanks()를 프로퍼티에 할당 -> 함수 호출의 결과(result)값이 할당
      • sayThanks가 아무것도 반환하지 않는다면 onclick 프로퍼티엔 undefined이 할당 -> 이벤트 동작 안됨
// 올바른 방법
button.onclick = sayThanks;

// 틀린 방법
button.onclick = sayThanks();

HTML 속성값에 함수 할당

  • HTML 속성값에는 괄호가 있어야 함
<input type="button" id="button" onclick="sayThanks()">
  • 브라우저는 속성값을 읽고, 속성값을 함수 본문으로 하는 핸들러 함수를 만들기 때문
  • 브라우저는 onclick 프로퍼티에 새로운 함수를 할당
button.onclick = function() {
  sayThanks(); // 속성값
};

setAttribute로 핸들러 할당하면 안됨

// <body>를 클릭하면 에러가 발생합니다.
// 속성은 항상 문자열이기 때문에, 함수가 문자열이 되어버리기 때문입니다.
document.body.setAttribute('onclick', function() { alert(1) });
  • 동작하지 않음

DOM 프로퍼티는 대소문자 구분

  • 핸들러 할당 시 elem.onclick은 괜찮지만, elem.ONCLICK은 안됨

해당 내용은 다음 자료를 참고했습니다.
https://ko.javascript.info/introduction-browser-events

0개의 댓글