sogno
카테고리
작성일
2022. 11. 11. 12:52
작성자
sognociel
  • 이벤트 | 마우스 클릭, 키보드 입력 등 사용자의 입력 행위나 문서 또는 브라우저의 상태 변화를 자바스크립트 코드에게 알리는 통지
  • 이벤트 리스너 | 발생한 이벤트에 대처하기 위해 작성된 자바스크립트 코드
  • 이벤트 종류 | HTML5에서 이벤트 종류는 70여개. 이벤트 리스너 이름은 이벤트 이름 앞에 ‘on’을 붙인다.

 

이벤트 리스너 종류는 아래 정리 글 참고

addEventListener 종류

 

 

 

01. 이벤트 리스너 만들기

  • HTML 태그 내에 이벤트 리스너 작성
  • DOM 객체의 이벤트 리스너 프로퍼티에 작성
  • DOM 객체의 addEventListener() 메서드 이용

 

 

HTML 태그 내에 이벤트 리스너 작성

<p onmouseover="this.style.backgroundColor='orange'"
   onmouseout="this.style.backgroundColor='blue'">
   여기는 p 태그
</p>

 

DOM 객체의 이벤트 리스너 프로퍼티에 작성

<!-- html의 body에 페이지가 로딩되면 실행되는 init() 함수 적용 -->

<body onload="init()">
  <p id="p">마우스 올리면 orange 색으로 변경</p>
  <script src="../js/1.js"></script>
</body>
// js 파일
function init() {
  const p = document.querySelector("#p");
  p.onmouseover = over; // 함수의 이름만 불러주어야 한다.
  p.onmouseout = out;
}

function over() {
  p.style.backgroundColor = "orange";
}

function out() {
  p.style.backgroundColor = "blue";
}

 

DOM 객체의 addEventListener() 메서드 이용

// 위 코드에서 init의 p. 부분만 수정

function init() {
  const p = document.querySelector("#p");
  p.addEventListener("mouseover", over); // 이벤트 리스너로 사용한다면 on 삭제
  p.addEventListener("mouseout", out); // 두 번째 매개변수에는 사용할 함수 선언
}

 

익명 함수로 이벤트 리스너 작성

익명 함수(anonymous function) | 함수 이름 없이 필요한 곳에 함수의 코드를 바로 작성

코드가 짧거나 한 곳에서만 사용하는 경우, 익명 함수가 편리하다.

p.onmouseover = function() { this.style.backgroundColor = "orange"; };

p.addEventListener("mouseover", function() { this.style.backgroundColor = "orange"; });

 

 

 

02. 이벤트 객체(event object)

발생한 이벤트에 관련된 다양한 정보를 담은 객체로 mousedown 이벤트의 경우 마우스 좌표와 버튼 번호 등, keydown 이벤트의 경우 키 코드 값 등 (검색창에서 검색 버튼을 누르지 않고 키패드 Enter를 눌렀을 때 자동으로 검색 버튼을 누른 것처럼 처리)

이벤트가 처리되고 나면 객체는 소멸한다.

 

이벤트 객체 전달받기

function eventFunction(e) { // e에는 event 정보를 담은 객체가 들어온다
    e.preventDefault(); // 함수의 기본적인 동작 수행을 막는 것
}

 

※ html에서 이벤트 객체를 전달할 때는 event라는 지정된 이름으로 전달해야 한다. (함수 안 e는 매개변수이기 때문에 상관없음)

<button onclick="eventFunction(event)">클릭하세요</button>

 

 

 

03. 실습

  • onclick 리스너로 계산기 만들기
  <body>
    <h3>onclick 계산기 만들기</h3>
    <hr />
    <p>계산하고자 하는 수식을 입력하고 계산 버튼을 누르세요</p>
    <form>
      <label><input type="text" id="exp" value="" /><br /></label>
      <label><input type="text" id="result" /></label>
      <label><input type="button" value="계산" /></label>
    </form>
  </body>
function calc() {
  const exp = document.querySelector("#exp");
  const result = document.querySelector("#result");
  result.value = eval(exp.value);
}

const button = document.querySelector('input[type="button"]');
button.addEventListener("click", calc);

 

  • 문서의 로딩 완료와 onload
<body onload="alert('이 사이트는 2021년 5월부터 www.js.co.kr로 옮겨집니다.')">
  <h3>HTML 문서의 로딩 완료, onload</h3>
  <hr>
  이 페이지는 onload 리스너의 사용 예를 보여줍니다.
  이 페이지가 출력되고 난 바로 직후 onload 리스너를 통해 경고창을 출력합니다.
</body>

 

  • 라디오 버튼과 체크박스
  <body>
    <form>
      <input type="radio" name="city" value="seoul" />서울
      <input type="radio" name="city" value="busan" />부산
      <input type="radio" name="city" value="chunchen" />춘천
      <input type="button" value="find checked" />
    </form>
  </body>
const button = document.querySelector(`input[type="button"]`);

function findChecked() {
  let find = null;
  let radio = document.getElementsByName("city");

  // for문 대신 forEach 사용
  radio.forEach((name) => {
    if (name.checked == true) find = name;
  });

  if (find != null) {
    alert(`${find.value} 이/가 선택되었읍`);
  } else {
    alert(`선택된 것이 없음`);
  }
}

button.addEventListener("click", findChecked);

 

querySelectorAll의 경우 결괏값이 배열로 나오기 때문에 각각의 체크박스에 이벤트 지정을 하려면 나온 배열의 인덱스로 따로 변수 지정을 해주어야 한다.

  <body>
    <h3>물품을 선택하면 금액이 자동 계산됩니다.</h3>
    <hr />
    <label>
      <input
        type="checkbox"
        name="hat"
        value="10000"
        onclick="calc(this)"
      />모자 1만원</label
    >
    <label
      ><input
        type="checkbox"
        name="shose"
        value="30000"
        onclick="calc(this)"
      />구두 3만원</label
    >
    <label>
      <input
        type="checkbox"
        name="bag"
        value="80000"
        onclick="calc(this)"
      />명품가방 8만원</label
    ><br />
    지불하실 금액 <input type="text" id="result" value="0" />
    <script src="../js/2.js"></script>
  </body>
let sum = 0;

function calc(checkedBox) {
  if (checkedBox.checked) {
    sum += parseInt(checkedBox.value);
  } else {
    sum -= parseInt(checkedBox.value);
  }

  document.querySelector("#result").value = sum;
}

 

select객체와 onchange

select는 click이 아니라 change 이벤트를 걸어주어야 한다.

  <body>
    <select id="fruits">
      // option의 value로 이미지 주소를 지정
      <option value="../../img/strawberry.png">딸기</option>
      <option value="../../img/banana.png">바나나</option>
      <option value="../../img/apple.png">사과</option>
    </select>
    <img id="fruit-image" src="" alt="" />
  </body>
function drawImage() {
  let img = document.querySelector("#fruit-image");
  // 이미지 주소를 선택된 option의 index를 찾고, 그 option의 value 값을 가져와 지정한다.
  // option의 value 값에 이미지 주소 경로가 지정되어 있어야 실행된다.
  img.src = select.options[select.selectedIndex].value;
}

let select = document.querySelector("#fruits");
select.addEventListener("change", drawImage);

 

 

 

'새싹DT 기업연계형 프론트엔드 실무 프로젝트 과정 4주차 블로그 포스팅'