inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

프로그래밍 시작하기 : 웹 입문 (Inflearn Original)

인스타그램 포스팅 카드 만들기 - 자바스크립트, 캐러셀 (4-2)

인디케이터 업데이트에서 오류가 발생합니다.

268

오아시스

작성한 질문수 12

0

첫 이미지에서 오른쪽 클릭을 하면 인디케이터가 바뀌고 또 다시 클릭을 하면 에러가 발생하고 바뀌지 않습니다

에러는 Uncaught TypeError: Cannot set property 'className' of undefined

    at updateIndicator (carousel.js:66)

    at HTMLDivElement.<anonymous> (carousel.js:44)

입니다

작성한 코드는 

window.addEventListener('load', function () {
  let carousels = document.getElementsByClassName('carousel');
  //캐러셀 이벤트를 등록하는 로직
  for (let i = 0; i < carousels.length; i++{
    addEventToCarousel(carousels[i]);
  }
});

function addEventToCarousel(carouselElem){
  let ulElem = carouselElem.querySelector('ul');
  let liElems = ulElem.querySelectorAll('li');

  //너비 값 조정
  let liWidth = liElems[0].clientWidth;
  let adjustedWidth = liElems.length * liWidth;
  ulElem.style.width = adjustedWidth + 'px';

  //슬라이드 버튼 이벤트 등록
  let slideButtons = carouselElem.querySelectorAll('.slide');
  for (let i = 0; i < slideButtons.length; i++){
    slideButtons[i].addEventListener('click', createListenerSlide(carouselElem));
  }

}

function createListenerSlide(carouselElem){
  return function(e){
    let clickedButton = event.currentTarget;

    //값 가져오기
    let liElems = carouselElem.querySelectorAll('li');
    let liCount = liElems.length;
    let currentIndex = carouselElem.attributes.data.value;

    //슬라이드 버튼 체크
    if(clickedButton.className.includes('right'&& currentIndex < liCount - 1){
        currentIndex ++;
        scrollDiv(carouselElem, currentIndex);
    } else if (clickedButton.className.includes('left'&& currentIndex > 0){
        currentIndex --;
        scrollDiv(carouselElem, currentIndex);
    }
    //인디케이터 업데이트
    updateIndicator(carouselElem, currentIndex);
    //슬라이드 버튼 보여줌 여부 업데이트

    //새롭게 보여지는 이미지 인덱스 값을 현재 data 값으로 업데이트
    carouselElem.attributes.data.value = currentIndex;
  }
}

function scrollDiv(carouselElem, nextIndex) {
  let scrollable = carouselElem.querySelector('div');
  let liWidth = scrollable.clientWidth;
  let newLeft = liWidth * nextIndex;

  scrollable.scrollTo({left: newLeft, behavior: 'smooth'});
}

function updateIndicator(carouselElem, currentIndex){
  let indicators = carouselElem.querySelectorAll('footer > div');
  for (let i = 0; indicators.length; i++{
    if (currentIndex == i){
      indicators[i].className = 'active';
    } else {
      indicators[i].className = '';
    }
  }
}
여기까지 입니다

javascript HTML/CSS

답변 1

0

오아시스

for (let i = 0; indicators.length; i++{

이 부분에서 i < indicators를 뺴먹었네요,, 해결했습니당

unregistered 이라 뜨며 작동하지 않습니다.

0

51

1

공부한 내용을 블로그에 정리해서 올려도되나요?

0

95

1

sublime text 설치 불가

0

177

1

사진과 본문 내용에 패딩이 40px 들어가 있는데 이유를 모르겠습니다

0

99

1

처음 질문과 옵션 관련 질문입니다.

0

90

1

마지막에 news 관련 질문

0

83

1

태그 닫는 단축키가 뭔가요?

0

170

1

강의에 사용하는 예제 코드 자료 있나요?

0

385

1

회원가입 폼 검증하기 실행이 안됩니다.

0

274

1

이미지랑 아이콘 파일을 어떻게 찾아요?

0

352

1

VS 코드는 절대 경로랑 상대 경로로 상위 문서 접근이 차단되어 있네요

0

476

0

프로젝트 고민 해결이 안되어 다시 올립니다.

0

394

1

프로젝트 고민 다시올립니다.

0

448

1

친구와의 프로젝트 고민

0

421

1

화면 오른쪽 스크롤이 넘어가질 않아요!

0

516

1

학과 설정

0

331

2

회원가입폼 검증 -2 에서 문제가생겼습니다

0

331

1

card.html 버튼 위치

0

602

1

인스타그램 코드 작성 후 동작을 해보았는데 버튼을 눌러도 넘어가질않네요

0

357

2

carousel의 footer부분에

0

295

1

margin 값에 관한 질문입니다.

0

407

1

function clearMessages() 함수의 원리를 알고싶습니다

0

320

1

removeEventListener

0

236

1

버튼을 눌렀을때 케러셀의 이동

0

810

2