API에서 데이터를 감염시키는 JS에 의해 생성되는 컨테이너의 CSSi ID를 선택하는 방법이 있습니까?

Jakub

일부 제품을 보여주는 페이지를 만들고 있으며 데이터는 API에서 가져옵니다. 이 페이지는 JS / es6 및 Bootstrap4로 구축되었습니다. 지금까지 내가 한 일은 데이터를 가져오고 forEach를 사용하여 API 데이터로 제품 카드를 동적으로 생성하는 것이 었습니다.

예:

listOfProducts.forEach(product => {
    // We create a template a blueprint for our cards and passing with literal template
    // Dynamically as foreach will loop and for every product in the array will print the card
    // using ${product.title} we pass the title of the product from JSON OBJ of our products
    // fetched from API
    out += `<div class="col-sm-6 col-md-4 py-2">`;
    out += `    <div id="${product.asin}" class="card h-100 d-flex flex-column">`;
    // To img we give src of the img from JSON OBJ and ALT the ASIN
    out += `        <img src="${product.img}" class="card-img-top" alt="${product.asin}">`;
    out += `        <div class="card-body">`;
    // We pass product title & price from JSON OBJ
    out += `            <h5 class="card-title">${product.title}</h5>`;
    out += `            <p class="card-text">${product.price}$</p>`;
    // Button add to cart & skip
    out += `            <button class="btn add-to-cart"><i class="fas fa-cart-plus"></i></button>`;
    out += `            <button class="btn skip"><i class="far fa-trash-alt"></i></button>`;
    out += `        </div>`;
    out += `    </div>`;
    out += `</div>`;

  }); 

내 문제는 위의 예에서 장바구니에 추가 버튼 작업을 시작했을 때입니다. 내가 지금 달성하고 싶은 것은 버튼을 클릭하면 카드가 테두리를 녹색으로 변경하는 클래스를 선택해야하지만 선택한 CSS ID를 가져 와서 선택한 클래스를 추가하거나 첨부 할 수 없다는 것입니다.

나는 다음과 같이 시도했다.

let test = row.querySelector('.add-to-cart').addEventListener('click', product => {
    const productId = document.querySelector(`#${product.asin}`);
    productId.class.add('selected');
 });

하지만 콘솔은 내 제품이 정의되지 않았거나 forEach 안에 같은 것을 넣으면 내 제품 ID가 null이므로 오류가 발생합니다.

내가 원하는 것은 다음과 같이 명확하게하는 것이기 때문에 최선의 해결책을 찾으려고 노력하고 있습니다.

  • 장바구니에 추가 버튼 클릭
  • 클릭 한 제품은 클래스가 선택되고 보드 색상이 녹색으로 변경됩니다.

내 전체 스크립트는 다음과 같습니다. mainjs

Mitya

이는 이벤트 콜백이 이벤트가 발생했을 때만 평가 product.asin되기 때문에 발생합니다. 반복이 완료 되었기 때문에이 시점 까지 반복의 마지막 항목에만 관련됩니다. 실제로 이벤트를 외부에서 바인딩하는 경우 범위 외부가 아닌 범위 내 에서만 로컬로 정의되므로 forEach오류가 발생 합니다. 콘솔에서 오류가 발생합니다. 항상 오류 콘솔을 확인하십시오.productforEach

또 다른 문제는 이벤트 콜백에 전달 된 첫 번째 인수가 트리거 요소라고 가정한다는 것입니다. 아니고 이벤트 객체입니다. 따라서 .target속성 이 필요 합니다.

어쨌든, 당신은 당신이하려는 일을하기 위해 ID에 대해 걱정할 필요가 없습니다. 클릭 한 카드에 추가 버튼을 기준으로 컨테이너 요소를 찾을 수 있습니다.

또한 class.add해야합니다 classList.add. 그것도 콘솔에서 오류를 일으켰을 것입니다.

마지막으로, 이벤트 리스너의 반환 값 ( undefined)을 변수 ( test, 귀하의 경우) 에 할당하는 것은별로 의미가 없습니다 .

그래서 :

row.querySelector('.add-to-cart').addEventListener('click', evt => {
    evt.target.closest('.card').classList.add('selected');
 });

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관