[JavaScript] resize 한 번만 실행

Lpla

·

2021. 6. 28. 21:17

반응형

다음 코드를 살펴보자.

이전 시간에 다룬 코드를 그대로 가져온 것이다.

 

[JavaScript/jQuery] 요소 추가, 삭제, 이동

반응형에 따라 요소의 위치를 바꾸려고 한다. css만으로 해결할 수 있다면 좋겠지만 단순하지 않은 레이아웃에서 css로 해결하기 어려운 경우가 있다. 이 때 자바스크립트, 특히 제이쿼리의 도움

lpla.tistory.com

 

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous"></script>

<script>
  resonsiveWidth();

  function resonsiveWidth() {
    let ww = $(window).width();
    $(window).on('resize', function () {
      ww = $(window).width();

      if (ww < 600) {
        mobileBox();
      } else {
        pcBox();
      }
    });
  }

  function mobileBox() {
    let $box3 = $('.box3');
    $('.box1').before($box3);
  }

  function pcBox() {
    let $box3 = $('.box3');
    $('.box2').after($box3);
  }
</script>

 

브라우저의 크기를 조절할 때 pcBox() 혹은 mobileBox() 함수가 실행되는 responsiveWidth() 함수이다.

그 결과 아래와 같은 기능을 수행한다.

 

 

 

하지만 브라우저의 크기가 1px이라도 변화가 있다면 즉시 resize 이벤트를 호출하게 되어 브라우저에 과부화를 일으킬 소지가 있다.

이는 콘솔로그를 찍어보면 더 극명하게 드러난다.

 

이렇게까지 resize 메서드를 실행할 필요가 없기 때문에 브라우저 크기를 조절할 때 한 번만 실행되도록 코드를 수정하겠다.

 

수정 전

  function resonsiveWidth() {
    let ww = $(window).width();
    $(window).on('resize', function () {
      ww = $(window).width();
      if (ww < 600) {
        mobileBox();
      } else {
        pcBox();
      }
    });
  }

 

수정 후

function resonsiveWidth() {
  let ww = $(window).width();
  let timer = null;
  let sec = 300;
  $(window).on('resize', function () {
    clearTimeout(timer);
    timer = setTimeout(function () {
      ww = $(window).width();
      if (ww < 600) {
        mobileBox();
      } else {
        pcBox();
      }
    }, sec);
  });
}

수정한 코드는 0.3초마다 이벤트가 실행 중인지 확인하고 실행 중이라면 시간을 다시 타이머한다.

즉 0.3초 동안 아무런 이벤트가 없다면 setTimeout() 메서드가 실행된다.

반응형