• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 JavaScript, TS 게시판 e.target.dataset._id가 undefined로 나옵니다

e.target.dataset._id가 undefined로 나옵니다

6 글 보임 - 1 에서 6 까지 (총 6 중에서)
  • 글쓴이
  • #64040

    이순민
    참가자
    e.target.dataset.id를 출력했을때 담기버튼을 눌렀을땐 id가 console.log로 확인이 가능한데 dragstart에선 undefined가 뜹니다.
    
    let products = [];
    let cart = [];
    
    
    $.get('./store.json').then(function (data) {
      products = data.products;
      // 상품 생성(json 파일 갯수만큼 추가)
      data.products.forEach((a, i) => {
        var 카드_템플릿 = `
        <div class="col-sm-3">
          <div class="item" draggable="true" data-id="${a.id}">
            < img src="${data.products[i].photo}"  style="width: 90%; height: auto;">
            <h5>${data.products[i].title}</h5>
            <span>${data.products[i].brand}</span>
            <p>가격 : ${data.products[i].price}</p>
            <button class="add" data-id="${data.products[i].id}">담기</button>
          </div>
        </div>`
        $('.productLine').append(카드_템플릿);
        // console.log(data.products[i].id)
      })
      // 담기 버튼 눌렀을때
      $('.add').click(function (e) {
        let productId = e.target.dataset.id;
        console.log(productId)
        let 몇번째 = cart.findIndex((a) => { return a.id == productId })
        if (몇번째 == -1) {
          let 현재상품 = products.find((a) => { return a.id == productId });
          현재상품.count = 1;
          cart.push(현재상품);
        } else {
          cart[몇번째].count++;
        }
        $('.basket-area').html('');
        cart.forEach((a, i) => {
          var 카드_템플릿 = `
          <div class="col-sm-3">
          <div class="item" "draggable="true">
            < img src="${a.photo}" style="width: 90%; height: auto;">
            <h5>${a.title}</h5>
            <span>${a.brand}</span>
            <p>가격 : ${a.price}</p>
            <input type="number" value="${a.count}" class="item-count w-100">
            </div>
            </div>`;
          $('.basket-area').append(카드_템플릿);
        });
      })
      //드래그 장바구니 추가
      $('.item').on('dragstart', function(e){
        let a = e.target.dataset.id;
        console.log(a)
        e.originalEvent.dataTransfer.setData('id', e.target.dataset.id)
      });
      $('.basket-area').on('dragover', function (e) {
        e.preventDefault();
      });
      $('.basket-area').on('drop', function (e) {
        let productId = e.originalEvent.dataTransfer.getData('id');
        console.log(productId)
      })
    
    
      // 검색 기능
      $(".input").on("keyup", function (e) {
        data.products.forEach((a, i) => {
          if (data.products[i].title.indexOf(e.target.value) != -1 || data.products[i].brand.indexOf(e.target.value) != -1) {
            let searchInput = e.target.value;
            let searchTitle = data.products[i].title;
            let searchTitle2 = searchTitle.replace(searchInput, `<span style="background : yellow">${searchInput}</span>`)
            $('.productLine').html('');
            var 카드_템플릿 = `
              <div class="col-sm-3">
              <div class="item" "draggable="true">
                < img src="${data.products[i].photo}" style="width: 90%; height: auto;">
                <h5>${searchTitle}</h5>
                <span>${data.products[i].brand}</span>
                <p>가격 : ${data.products[i].price}</p>
                <button class="add" data-id="${a.id}">담기</button>
                </div>
                </div>`;
            $('.productLine').append(카드_템플릿);
            $('.col-sm-3 > h5').html(searchTitle2);
          }
        })
        // 검색기능(입력값과 동일 한것이 없을때 기존의 상품목록 불러오기)
        if (e.target.value === "" || e.target.value === undefined) {
          $('.productLine').html('');
          data.products.forEach((a, i) => {
            var 카드_템플릿 = `
                  <div class="col-sm-3">
                  <div class="item" "draggable="true" >
                    < img src="${data.products[i].photo}" style="width: 90%; height: auto;">
                    <h5>${data.products[i].title}</h5>
                    <span>${data.products[i].brand}</span>
                    <p>가격 : ${data.products[i].price}</p>
                    <button class="add" data-id="${a.id}">담기</button>
                    </div>
                    </div>`;
            $('.productLine').append(카드_템플릿);
          })
        }
      })
    })
     
    #64055

    codingapple
    키 마스터
    .item 달린 html이 생성된 후에도 dragstart 이벤트리스너를 부착합시다
    #64111

    이순민
    참가자
    예시코드가 있을까요? 어떤식으로 해결해야할지 못찾겠습니다..
     
    #64115

    이순민
    참가자
    센세 코드보고 코드 다이어트(리팩토링?)를 진행했기때문에 전체 코드를 다시 올리겠습니다.
    
    
    
    let products = [];
    let cart = [];
    $.get('./store.json').then(function (data) {
      //원본데이터 다른데서 많이 쓰니까 변수에 보관
      products = data.products;
      // 상품 생성(json 파일 갯수만큼 추가)
      data.products.forEach((a, i) => {
        $('.productLine').append(`
      <div class="col-sm-3">
        <div class="item" draggable="true" data-id="${a.id}">
          < img src="${a.photo}" style="width: 90%; height: auto;" >
          <h5>${a.title}</h5>
          <span>${a.brand}</span>
          <p>가격 : ${a.price}</p>
          <button class="add" data-id="${a.id}">담기</button>
          <button class="test" data-id="${a.id}">test</button>
        </div>
      </div>`);
      });
      // 담기 버튼 눌렀을때
      $('.add').click(function (e) {
        //지금 누른 상품번호
        let productId = e.target.dataset.id;
        console.log(productId)
        // 담기버튼 누를 때 let cart = []에 상품을 {} 형태로 보관부터하고
        //let cart에 상품이 이미 있는지 찾고 없으면 let cart에 {}추가, 있으면 수량만 추가;
        let 몇번째 = cart.findIndex((a) => { return a.id == productId })
        if (몇번째 == -1) {
          let 현재상품 = products.find((a) => { return a.id == productId });
          현재상품.count = 1;
          cart.push(현재상품);
        } else {
          cart[몇번째].count++;
        }
        //담기버튼 누를 때 마다 박스에 let cart 안에 있던 {} 갯수만큼 html 생성
        $('.basket-area').html('');
        cart.forEach((a, i) => {
          $('.basket-area').append(`
            <div class="col-sm-3">
                < img src="${a.photo}" style="width: 90%; height: auto;">
                <h5>${a.title}</h5>
                <span>${a.brand}</span>
                <p>가격 : ${a.price}</p>
                <input type="number" value="${a.count}" class="item-count w-100">
            </div>`);
        });
      }); //담기버튼 끝
      //드래그 장바구니 추가
      $('item').on('dragstart', function (e) {
        let a = e.target.dataset.id;
        console.log(a)
        e.originalEvent.dataTransfer.setData('id', e.target.dataset.id)
      });
      $('.basket-area').on('dragover', function (e) {
        e.preventDefault();
      });
      $('.basket-area').on('drop', function (e) {
        let productId = e.originalEvent.dataTransfer.getData('id');
        console.log(productId)
      });
      
    }); // get then 끝;
    // 검색 기능
    $("#search").on("input", function (e) {
      let 검색어 = $('#search').val();
      //지금입력한 글자가 제목에 있으면 let products에서 검색어있는 것만 남기기
      let newProducts = products.filter((a) => {
        return a.title.includes(검색어) || a.brand.includes(검색어)
      });
      $('.productLine').html('');
      newProducts.forEach((a, i) => {
        $('.productLine').append(`
                <div class="col-sm-3">
                < img src="${a.photo}" style="width: 90%; height: auto;">
                <h5>${a.title}</h5>
                <span>${a.brand}</span>
                <p>가격 : ${a.price}</p>
                <button class="add" data-id="${a.id}">담기</button>
                </div>`)
      })
      $('.col-sm-3 > h5').each(function (i, html요소) {
        let title = html요소.innerHTML;
        title = title.replace(검색어, `<span style="background : yellow">${검색어}</span>`)
        html요소.innerHTML = title;
      })
    })
    
    
    		
    	
    #64136

    이순민
    참가자
    센세 이렇게 코드를 추가해서 해결했습니다..  괜찮은걸까요?
    
    ------------------변경전 ------------------------
      //드래그 장바구니 추가
      $('item').on('dragstart', function (e) {
        let a = e.target.dataset.id;
        console.log(a)
        e.originalEvent.dataTransfer.setData('id', e.target.dataset.id)
      });
      $('.basket-area').on('dragover', function (e) {
        e.preventDefault();
      });
      $('.basket-area').on('drop', function (e) {
        let productId = e.originalEvent.dataTransfer.getData('id');
        console.log(productId)
      });
    ------------------변경전 ------------------------
    
    
    -----------------------변경 후 -----------------------------------------
      //장바구니 드래그
        $('.item').on('dragstart', function (e) {
          e.originalEvent.dataTransfer.setData('id', e.target.dataset.id)
          
          let productId = e.target.dataset.id;
          let 몇번째 = cart.findIndex((a) => { return a.id == productId })
          if (몇번째 == -1) {
            let 현재상품 = products.find((a) => { return a.id == productId });
            현재상품.count = 1;
            cart.push(현재상품);
          } else {
            cart[몇번째].count++;
          }
        });
        $('.basket-area').on('dragover', function (e) {
          e.preventDefault();
        });
        $('.basket-area').on('drop', function (e) {
          let productId = e.originalEvent.dataTransfer.getData('id');
          console.log(productId)
          $('.basket-area').html('');
          cart.forEach((a, i) => {
            $('.basket-area').append(`
            <div class="col-sm-3">
            < img src="${a.photo}" style="width: 90%; height: auto;">
            <h5>${a.title}</h5>
            <span>${a.brand}</span>
            <p>가격 : ${a.price}</p>
            <input type="number" value="${a.count}" class="item-count w-100">
            </div>`);
          });
        });
    }); // get then 끝;
    -----------------------변경 후 -----------------------------------------
    
     
    #64143

    codingapple
    키 마스터
    class="item" 붙은 html들 생성하는 코드 밑에 
    $('item').on('dragstart', 이거 복사해서 넣어줘도 될거같은데 
    잘되면 상관없습니다 
    
    
6 글 보임 - 1 에서 6 까지 (총 6 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관, 개인정보처리방침
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠