프론트엔드 첫걸음

스크롤이 끝나면 alert 띄우기 - removeEventListener 본문

개발 공부/Javascript

스크롤이 끝나면 alert 띄우기 - removeEventListener

차정 2022. 7. 16. 03:12
[코딩애플 JavaScript 입문과 웹 UI개발] 강의 수강 후 배운 것을 정리한 것입니다.
https://codingapple.com/course/javascript-jquery-ui/

 

스크롤바 내린 높이 : scrollTop
div 박스의 실제 높이 : scrollHeight
눈에보이는 div 박스의 높이 : clientHeight

실제 높이 = 스크롤 내린높이 + 눈에보이는 눈에보이는 div 박스의 높이 

$div.scrollHeight = $div.scrollTop  + $div.clientHeight 

가 되면 스크롤이 전부 내려왔다는 뜻이다.

 

 

스크롤이 다 내려왔을때 alert를 띄우는 javascript 코드는 다음과 같다.

( -5는 오차를 감안한 것이다.. 완전히 스크롤 끝까지 닿지않고 스크롤 끝에서 5px정도 떨어져도 약관을 다 읽었다고 보는 것..)

let $lorem = document.querySelector('.lorem');

$lorem.addEventListener('scroll', function () {
    if ($lorem.clientHeight + $lorem.scrollTop >= $lorem.scrollHeight - 5) {
      alert('약관을 다 읽으셨습니다');
      $lorem.removeEventListener('scroll', arguments.callee);
    }
});

 

여기서 arguments.callee는 익명함수 자체를 가리킨다고 한다.

익명함수를 따로 빼준 다음에  $lorem.removeEventListener('scroll', 함수명) 해줘도된다.

  function alertEnd() {
    if ($lorem.clientHeight + $lorem.scrollTop >= $lorem.scrollHeight - 5) {
      alert('약관을 다 읽으셨습니다');
      $lorem.removeEventListener('scroll', alertEnd);
    }
  }
  $lorem.addEventListener('scroll', alertEnd);

arguments.callee를 사용하는 전자가 더 간편하다.

 

 

removeEventListner를 몰랐을 때는 전역변수 readOnce를 false로선언해놓고,

if 문에 (!readOnce && 라는 조건을 추가해 준 뒤에 alert뒤에 readOnce 를 true로 바꾸는 로직을 사용했다.

removeEventListner를 사용하는 것이 더 나은것 같다. 

 

 

 

[출처 및 참고]

https://ko.javascript.info/size-and-scroll-window

https://developer.mozilla.org/ko/docs/Web/API/Element/scrollHeight

https://inpa.tistory.com/entry/JS-📚-이벤트-제거-한번만-실행되게-하기-removeEventListener-once
        

 

See the Pen scroll by JEONG (@cona) on CodePen.