영화 검색 사이트를 만드는데 무한스크롤을 구현하게 됐다. 그 과정에서 알게된 것들을 기록해두려고 한다.
const test = async () => {
console.log('api 호출!');
};
// 스크롤 이벤트
document.addEventListener('scroll', test);
const infinite = async () => {
console.log('api 호출!');
};
// 디바운스(마지막 호출함수만 실행)
let timer = null;
const debouncing = () => {
//스크롤할 때마다 타이머 재설정
if (timer) clearTimeout(timer);
timer = setTimeout(infinite, 500);
};
// 스크롤 이벤트
document.addEventListener('scroll', debouncing);
timer=null
이므로 조건문 내의 코드를 실행하지 않고 timer에 setTimeout을 할당한다. 스크롤이 연속적으로 여러번 실행되면, 맨 처음에 timer에 할당된 것은 초기화 되고 다시 setTimeout이 실행되는 것이 여러번 반복된다. 여기서 500ms 가 지나지 않았다면 setTimeout 내의 콜백함수는 한번도 실행되지 않았다. // 무한스크롤
const infinite = async () => {
if (
searchInputEl.value &&
window.innerHeight + window.scrollY >= document.body.offsetHeight
) {
countPages++;
searchData(searchInputEl.value, selectYearEl.value, countPages);
}
};
innerHeight
(메뉴바, 툴바 제외한 안쪽 창 영역의 높이와 너비), scrollY
(전체 컨텐츠를 얼마나 스크롤했는가에 대한 값), offsetHeight
(기준점 기준으로 왼쪽과 위에서 얼마나 떨어져있는 가에 대한 값)을 활용했다.document.content
가 있다.window.innerHeight
보라색 영역이 보고 있는 브라우저 창이다. 처음엔 document.content
의 최상단에 위치했지만, scroll을 내리면서 맨 아래로 내려오게 됐고, 동시에 window.scrollY
의 값이 증가했을 것이다.window.innerHeight
+ window.scrollY
의 값이 document.body.offsetHeight
보다 같게되는 지점이다.document.body.offsetHeight
의 값은 증가할 것이다. 사용자가 더 많은 정보를 보려고 아래로 스크롤 할 때마다 window.scrollY
의 값도 증가할 것이다. 이러한 값 변화에 따라 조건을 충족시키며 무한스크롤이 동작하도록 했다.이렇게 API와 라이브러리 사용없이 무한스크롤을 구현하고나니, 예상했던 것보다 코드의 양이 적고 간단하다고 생각했다. 그러고나니 API와 라이브러리를 왜 사용하는지 의문이 들었다.