anonymous No title
No License JavaScript
2021年02月11日
Copy Clone
import $ from 'jquery'
import 'slick-carousel';
import router from './modules/Router'
import "slick-carousel/slick/slick.scss";
import "slick-carousel/slick/slick.min.js";
import '../scss/app.scss'
import item_data from './item_data.js'
import './jquery.elevatezoom.js';

$(() => {
  const page_type = $('.contents').attr('id'),
    categorys = ['men', 'woman', 'kids'],
    param_key = location.search.substring(1).split('=')[0],
    param_value = location.search.substring(1).split('=')[1];

  let more_count = {
    'brand': 3,
    'items': 10
  };

  // オブジェクトをhtmlに変換する
  // 返り値: html
  function createDom(items, delete_btn_flg = null) {
    const imgPath = "/assets/images/";

    let html_template = '';
    let delete_dom = '';

    if (delete_btn_flg) {
      delete_dom = `<div class="cart-delete"><img src="${imgPath}/icon_delete.svg"></div>`;
    }

    /*
      仮に「delete_btn_flg = false」だと、
      他でcreateDomする時に毎回毎回、第2実引数にfalseをとらなくてはいけない。
     */
    items.forEach(function (item, index) {
      html_template +=
        `<li class="c-blockList__item" data-item-id="${item.id}">
          <a href="/detail/index.html?id=${item.id}">
            <div class="c-blockList__item__cap">
              <img src="${imgPath}/item/${item.id}.png" alt="new item" loading="lazy">
            </div>
            <ul class="c-blockList__item__txtList">
              <li class="c-blockList__item__txtList__item">
                <p class="c-blockList__item__txtList__item__product">${item.name}</p>
                <p class="c-blockList__item__txtList__item__detail">${item.text}</p>
                <p class="c-blockList__item__txtList__item__price">¥${item.price}</p>
              </li>
            </ul>
          </a>
          ${delete_dom}
        </li>
      `;
    });

    return html_template;
  }

  // 関数 もっと見るボタン
  function moreControl(el, num) {
    const more_type = $(el).attr('data-more-btn'),
      target_list = $(`[data-more-list="${more_type}"]`),
      max_count = target_list.find('li').length;

    more_count[more_type] += num;

    target_list.find(`li:lt(${more_count[more_type]})`).fadeIn();

    if (more_count[more_type] >= max_count) {
      $(el).hide();
    }
  }

  function searchWordShow() {
    let result_text;

    if (param_key == 'price') {
      result_text = `〜${param_value}円`;
      $(`jsi-price-select option[value="${param_value}"]`).prop('selected', true);
    } else {
      result_text = param_value;
    }

    $('.jsc-elem-add').text(decodeURI(result_text));
  }

  function getItemSingle() {
    return item_data.find(function (item) {
      return item['id'] == param_value;
    })
  }

  // item_dataのnewプロパティの真偽値を判定する
  // 返り値: items
  function getItemList(key, value = null) { // valueはなくてもいいけど、あったら使うよ!という意味
    const search_value = value ? value : param_value, // パラメーターがあるかどうか
      freeWords = ['name', 'text'];

    const items = item_data.filter(function (item, index) {
      switch (key) {
        case 'brand':
        case 'category':
          return item[key] == search_value
          break;
        case 'freeWord':
          return freeWords.find(function (freeWord) {
            return item[freeWord].indexOf(decodeURI(param_value)) !== -1;
          });
          break;
        case 'price':
          return item[key] <= search_value
          break;
        case 'new':
          return item.new
          break;
      }
    });
    searchWordShow();

    return items;
  }

  function pickUpShuffle(item_data) {
    let items = [],
      rand_check = []; // 重複があるかどうかを確認する用

    for (let i = 0; i < 6; i++) {
      let j = Math.floor(Math.random() * item_data.length);

      if (rand_check.indexOf(j) !== -1) {
        i--; // 値が被ると与えられる要素が3つとか4つになっちゃう。それを防ぐため! 絶対に重複がない
        continue;
      } else {
        rand_check.push(j);
        items.push(item_data[j]);
      }
    }
    return items;
  }

  function storageControl(id) {
    let strage_data = JSON.parse(localStorage.getItem('ninco_cart'));
    id = Number(id);

    if (strage_data == null) {
      strage_data = [id]; // 配列として入れる
    } else { // データが1つ以上ある時
      if (strage_data.indexOf(id) !== -1) { // 同じものが入っていた場合
        strage_data.splice(strage_data.indexOf(id), 1); // 消去する
      } else {
        strage_data.push(id);
      }
    }

    localStorage.setItem('ninco_cart', JSON.stringify(strage_data));
  }

  function storageSaveJudge(id) {
    let strage_data = JSON.parse(localStorage.getItem('ninco_cart'));
    id = Number(id);

    if (strage_data !== null) { // もし要素が入っていたら
      return strage_data.indexOf(id) !== -1; // true
    }
  }

  function doneFlash(text) {
    $('body').append(`<div class="c-flash">${text}</div>`);
    setTimeout(function () {
      location.reload(); // ローカルストレージはリロードされた時に反映されるため
    }, 2000);
  }

  $('.jsc-slick').slick({
    speed: 2000,
    autoplay: true,
    autoplaySpeed: 3000,
    dots: true,
    arrows: true,
    pauseOnHover: true,
    slidesToShow: 1,
    centerMode: true,
    centerPadding: '25%',
    prevArrow: '<div class="prev"></div>',
    nextArrow: '<div class="next"></div>',
    dotsClass: 'slick-dots',

    responsive: [{
      breakpoint: 768,
      settings: {
        centerMode: false,
        centerPadding: false
      }
    }]
  });

  $(window).on('load', function () {

    // ローディング
    setTimeout(function () {
      $('.jsi-elem-fadeOut').fadeOut();
    }, 600);
  });

  $(window).on('scroll', function () {
    const scrollPos = $(this).scrollTop(),
      wHeight = $(this).innerHeight();

    // フェードイン
    $('[data-fadeIn]').each(function (index, el) {
      const elePos = $(el).offset().top;

      if (scrollPos > elePos - (wHeight / 2)) {
        $(el).addClass('is-show');
      }
    });

    // ころりん
    $('.jsc-elem-slide-rotate').each(function () {
      const brandPos = $('.jsi-elem-pos').offset().top;
      const menPos = $('.jsi-men-pos').offset().top;

      (scrollPos > menPos - wHeight ? $(this).addClass('is-show') : $(this).removeClass('is-show'));

      (scrollPos > brandPos - wHeight / 2 + 100 ? $(this).removeClass('is-show') : $(this).addClass('is-show'));
    });
  });

  // ハンバーガーメニュー
  $('.jsc-elem-trigger').on('touchstart', function (e) {
    e.preventDefault();

    $('.jsc-elem-change').toggleClass('is-active');
    $('.jsc-elem-slideIn').toggleClass('is-active');
  });

  // サイズ選択
  $('.jsc-elem-select').on('click', function () {
    const $select_size = $(this).text();

    $(this).addClass('is-active');
    $(this).siblings().removeClass('is-active'); // 押した要素の兄弟要素

    $('.jsc-elem-size').text($select_size);
  });

  // レビュー選択
  const selectReview = (function () {
    let review_num = 0;

    $('.jsc-elem-review').on('click', function () {
      if (review_num == $('.jsc-elem-review').index(this) + 1) {
        $('.jsc-elem-review').removeClass('is-active');
        review_num = 0;
      } else {
        review_num = $('.jsc-elem-review').index(this) + 1;
        $('.jsc-elem-review').removeClass('is-active');
        $(`.jsc-elem-review:lt('${review_num}')`).addClass('is-active');
      }
    });
  })();

  // 商品説明
  $('.jsc-elem-show').on('click', function () {
    $(this).toggleClass('is-active');

    $('.jsc-elem-slideDown').slideToggle();
  });

  // NEWの一覧を取得
  if (page_type == 'page_index') {
    let item_list_new = getItemList('new');

    $('[data-item-list="new"]').append(createDom(item_list_new));

    categorys.forEach(function (category) {
      let item_list_category = getItemList('category', category);

      item_list_category = createDom(item_list_category);
      $(`[data-item-list="${category}"]`).append(item_list_category);
    });
  }

  // カートからアイテムを削除
  $('body').on('click', '.cart-delete', function () {
    if (confirm('本当に削除して良いですか?')) {
      const item_id = $(this).parents('[data-item-id]').attr('data-item-id');

      storageControl(item_id);

      setTimeout(function () {
        location.reload();
      }, 200);
    }
  });
  
  // 購入ボタンを押した時の処理
  $('.jsi-btn-buy').on('click', function () {
    if (confirm('購入して良いですか?')) {
      localStorage.removeItem('ninco_cart');
      alert('購入しました!');
    }
  });

  // カートに追加
  $('.jsi-btn-addCart').on('click', function () {
    const item_id = $(this).parents('.jsi-elem-detail').attr('data-item-id');
    storageControl(item_id);

    if (storageSaveJudge(item_id)) {
      doneFlash('カートに追加しました。');
    } else {
      doneFlash('カートから外しました。');
    }
  });

  // カートに入れたアイテムを生成
  const cart_storage = JSON.parse(localStorage.getItem('ninco_cart'));

  // ストレージ合計値計算
  if (cart_storage !== null) {
    let cart_price = 0;

    const cart_items = item_data.filter(function (item) {
      if (cart_storage.indexOf(item.id) !== -1) {
        cart_price += item.price;
        return item;
      }
    });

    $('#cart-list').append(createDom(cart_items, true));
    $('[data-total-num="number"],.jsc-elem-batch').text(cart_storage.length);

    if (cart_storage.length <= 0) {
      $('.jsc-elem-batch').hide();
    }

    $('[data-total-num="price"]').text(cart_price);
  } else {
    $('.jsc-elem-batch').hide();
  }

  // 詳細ページ
  if (page_type == 'page_detail') {
    const item_detail = getItemSingle();

    Object.keys(item_detail).forEach(function (key) {
      $(`[data-item-parts="${key}"]`).text(item_detail[key]);
    });

    $('#zoom-image').attr('src', `/assets/images/item/${item_detail.id}.png`);
    $('#zoom-image').attr('data-zoom-image', `/assets/images/item/${item_detail.id}_l.png`);
    $('.jsi-elem-detail').attr('data-item-id', item_detail.id);

    if (!item_detail.new) {
      $('.new-label').remove();
    }

    if (storageSaveJudge(item_detail.id)) {
      $('.jsi-btn-addCart').addClass('is-active');
    }

    $('[data-zoom-image]').elevateZoom();
  }

  // 一覧ページ
  if (page_type == 'page_list') {
    const item_list = createDom(getItemList(param_key));

    $('[data-more-list="items"]').append(item_list);
    $('.jsi-price-select').on('change', function () {
      $('#price-form').submit();
    });
  }

  // ピックアップリスト作成
  const item_list_pickup = createDom(pickUpShuffle(item_data));

  $('[data-item-list="pickup"]').append(item_list_pickup);


  // モーダル実装
  $('.jsi-elem-trigger-strage').on('click', function (e) {
    e.preventDefault(); // aタグの遷移する能力を打ち消す

    $('.jsc-elem-fadeToggle').addClass('is-active');
    // スマホ用
    $('.jsc-elem-change, .jsc-elem-slideIn').removeClass('is-active');
  });


  $('.jsi-elem-close').on('click', function (e) {
    e.preventDefault(); // aタグの遷移する能力を打ち消す

    $('.jsc-elem-fadeToggle').removeClass('is-active');
  });

  // もっと見るボタン実装
  $('[data-more-btn="brand"]').on('click', function () {
    moreControl($(this), 3);
  });

  $('[data-more-btn="items"]').on('click', function () {
    moreControl($(this), 10);
  });
})
import $ from 'jquery'
import 'slick-carousel';
import router from './modules/Router'
import "slick-carousel/slick/slick.scss";
import "slick-carousel/slick/slick.min.js";
import '../scss/app.scss'
import item_data from './item_data.js'
import './jquery.elevatezoom.js';

$(() => {
  const page_type = $('.contents').attr('id'),
    categorys = ['men', 'woman', 'kids'],
    param_key = location.search.substring(1).split('=')[0],
    param_value = location.search.substring(1).split('=')[1];

  let more_count = {
    'brand': 3,
    'items': 10
  };

  // オブジェクトをhtmlに変換する
  // 返り値: html
  function createDom(items, delete_btn_flg = null) {
    const imgPath = "/assets/images/";

    let html_template = '';
    let delete_dom = '';

    if (delete_btn_flg) {
      delete_dom = `<div class="cart-delete"><img src="${imgPath}/icon_delete.svg"></div>`;
    }

    /*
      仮に「delete_btn_flg = false」だと、
      他でcreateDomする時に毎回毎回、第2実引数にfalseをとらなくてはいけない。
     */
    items.forEach(function (item, index) {
      html_template +=
        `<li class="c-blockList__item" data-item-id="${item.id}">
          <a href="/detail/index.html?id=${item.id}">
            <div class="c-blockList__item__cap">
              <img src="${imgPath}/item/${item.id}.png" alt="new item" loading="lazy">
            </div>
            <ul class="c-blockList__item__txtList">
              <li class="c-blockList__item__txtList__item">
                <p class="c-blockList__item__txtList__item__product">${item.name}</p>
                <p class="c-blockList__item__txtList__item__detail">${item.text}</p>
                <p class="c-blockList__item__txtList__item__price">¥${item.price}</p>
              </li>
            </ul>
          </a>
          ${delete_dom}
        </li>
      `;
    });

    return html_template;
  }

  // 関数 もっと見るボタン
  function moreControl(el, num) {
    const more_type = $(el).attr('data-more-btn'),
      target_list = $(`[data-more-list="${more_type}"]`),
      max_count = target_list.find('li').length;

    more_count[more_type] += num;

    target_list.find(`li:lt(${more_count[more_type]})`).fadeIn();

    if (more_count[more_type] >= max_count) {
      $(el).hide();
    }
  }

  function searchWordShow() {
    let result_text;

    if (param_key == 'price') {
      result_text = `〜${param_value}円`;
      $(`jsi-price-select option[value="${param_value}"]`).prop('selected', true);
    } else {
      result_text = param_value;
    }

    $('.jsc-elem-add').text(decodeURI(result_text));
  }

  function getItemSingle() {
    return item_data.find(function (item) {
      return item['id'] == param_value;
    })
  }

  // item_dataのnewプロパティの真偽値を判定する
  // 返り値: items
  function getItemList(key, value = null) { // valueはなくてもいいけど、あったら使うよ!という意味
    const search_value = value ? value : param_value, // パラメーターがあるかどうか
      freeWords = ['name', 'text'];

    const items = item_data.filter(function (item, index) {
      switch (key) {
        case 'brand':
        case 'category':
          return item[key] == search_value
          break;
        case 'freeWord':
          return freeWords.find(function (freeWord) {
            return item[freeWord].indexOf(decodeURI(param_value)) !== -1;
          });
          break;
        case 'price':
          return item[key] <= search_value
          break;
        case 'new':
          return item.new
          break;
      }
    });
    searchWordShow();

    return items;
  }

  function pickUpShuffle(item_data) {
    let items = [],
      rand_check = []; // 重複があるかどうかを確認する用

    for (let i = 0; i < 6; i++) {
      let j = Math.floor(Math.random() * item_data.length);

      if (rand_check.indexOf(j) !== -1) {
        i--; // 値が被ると与えられる要素が3つとか4つになっちゃう。それを防ぐため! 絶対に重複がない
        continue;
      } else {
        rand_check.push(j);
        items.push(item_data[j]);
      }
    }
    return items;
  }

  function storageControl(id) {
    let strage_data = JSON.parse(localStorage.getItem('ninco_cart'));
    id = Number(id);

    if (strage_data == null) {
      strage_data = [id]; // 配列として入れる
    } else { // データが1つ以上ある時
      if (strage_data.indexOf(id) !== -1) { // 同じものが入っていた場合
        strage_data.splice(strage_data.indexOf(id), 1); // 消去する
      } else {
        strage_data.push(id);
      }
    }

    localStorage.setItem('ninco_cart', JSON.stringify(strage_data));
  }

  function storageSaveJudge(id) {
    let strage_data = JSON.parse(localStorage.getItem('ninco_cart'));
    id = Number(id);

    if (strage_data !== null) { // もし要素が入っていたら
      return strage_data.indexOf(id) !== -1; // true
    }
  }

  function doneFlash(text) {
    $('body').append(`<div class="c-flash">${text}</div>`);
    setTimeout(function () {
      location.reload(); // ローカルストレージはリロードされた時に反映されるため
    }, 2000);
  }

  $('.jsc-slick').slick({
    speed: 2000,
    autoplay: true,
    autoplaySpeed: 3000,
    dots: true,
    arrows: true,
    pauseOnHover: true,
    slidesToShow: 1,
    centerMode: true,
    centerPadding: '25%',
    prevArrow: '<div class="prev"></div>',
    nextArrow: '<div class="next"></div>',
    dotsClass: 'slick-dots',

    responsive: [{
      breakpoint: 768,
      settings: {
        centerMode: false,
        centerPadding: false
      }
    }]
  });

  $(window).on('load', function () {

    // ローディング
    setTimeout(function () {
      $('.jsi-elem-fadeOut').fadeOut();
    }, 600);
  });

  $(window).on('scroll', function () {
    const scrollPos = $(this).scrollTop(),
      wHeight = $(this).innerHeight();

    // フェードイン
    $('[data-fadeIn]').each(function (index, el) {
      const elePos = $(el).offset().top;

      if (scrollPos > elePos - (wHeight / 2)) {
        $(el).addClass('is-show');
      }
    });

    // ころりん
    $('.jsc-elem-slide-rotate').each(function () {
      const brandPos = $('.jsi-elem-pos').offset().top;
      const menPos = $('.jsi-men-pos').offset().top;

      (scrollPos > menPos - wHeight ? $(this).addClass('is-show') : $(this).removeClass('is-show'));

      (scrollPos > brandPos - wHeight / 2 + 100 ? $(this).removeClass('is-show') : $(this).addClass('is-show'));
    });
  });

  // ハンバーガーメニュー
  $('.jsc-elem-trigger').on('touchstart', function (e) {
    e.preventDefault();

    $('.jsc-elem-change').toggleClass('is-active');
    $('.jsc-elem-slideIn').toggleClass('is-active');
  });

  // サイズ選択
  $('.jsc-elem-select').on('click', function () {
    const $select_size = $(this).text();

    $(this).addClass('is-active');
    $(this).siblings().removeClass('is-active'); // 押した要素の兄弟要素

    $('.jsc-elem-size').text($select_size);
  });

  // レビュー選択
  const selectReview = (function () {
    let review_num = 0;

    $('.jsc-elem-review').on('click', function () {
      if (review_num == $('.jsc-elem-review').index(this) + 1) {
        $('.jsc-elem-review').removeClass('is-active');
        review_num = 0;
      } else {
        review_num = $('.jsc-elem-review').index(this) + 1;
        $('.jsc-elem-review').removeClass('is-active');
        $(`.jsc-elem-review:lt('${review_num}')`).addClass('is-active');
      }
    });
  })();

  // 商品説明
  $('.jsc-elem-show').on('click', function () {
    $(this).toggleClass('is-active');

    $('.jsc-elem-slideDown').slideToggle();
  });

  // NEWの一覧を取得
  if (page_type == 'page_index') {
    let item_list_new = getItemList('new');

    $('[data-item-list="new"]').append(createDom(item_list_new));

    categorys.forEach(function (category) {
      let item_list_category = getItemList('category', category);

      item_list_category = createDom(item_list_category);
      $(`[data-item-list="${category}"]`).append(item_list_category);
    });
  }

  // カートからアイテムを削除
  $('body').on('click', '.cart-delete', function () {
    if (confirm('本当に削除して良いですか?')) {
      const item_id = $(this).parents('[data-item-id]').attr('data-item-id');

      storageControl(item_id);

      setTimeout(function () {
        location.reload();
      }, 200);
    }
  });
  
  // 購入ボタンを押した時の処理
  $('.jsi-btn-buy').on('click', function () {
    if (confirm('購入して良いですか?')) {
      localStorage.removeItem('ninco_cart');
      alert('購入しました!');
    }
  });

  // カートに追加
  $('.jsi-btn-addCart').on('click', function () {
    const item_id = $(this).parents('.jsi-elem-detail').attr('data-item-id');
    storageControl(item_id);

    if (storageSaveJudge(item_id)) {
      doneFlash('カートに追加しました。');
    } else {
      doneFlash('カートから外しました。');
    }
  });

  // カートに入れたアイテムを生成
  const cart_storage = JSON.parse(localStorage.getItem('ninco_cart'));

  // ストレージ合計値計算
  if (cart_storage !== null) {
    let cart_price = 0;

    const cart_items = item_data.filter(function (item) {
      if (cart_storage.indexOf(item.id) !== -1) {
        cart_price += item.price;
        return item;
      }
    });

    $('#cart-list').append(createDom(cart_items, true));
    $('[data-total-num="number"],.jsc-elem-batch').text(cart_storage.length);

    if (cart_storage.length <= 0) {
      $('.jsc-elem-batch').hide();
    }

    $('[data-total-num="price"]').text(cart_price);
  } else {
    $('.jsc-elem-batch').hide();
  }

  // 詳細ページ
  if (page_type == 'page_detail') {
    const item_detail = getItemSingle();

    Object.keys(item_detail).forEach(function (key) {
      $(`[data-item-parts="${key}"]`).text(item_detail[key]);
    });

    $('#zoom-image').attr('src', `/assets/images/item/${item_detail.id}.png`);
    $('#zoom-image').attr('data-zoom-image', `/assets/images/item/${item_detail.id}_l.png`);
    $('.jsi-elem-detail').attr('data-item-id', item_detail.id);

    if (!item_detail.new) {
      $('.new-label').remove();
    }

    if (storageSaveJudge(item_detail.id)) {
      $('.jsi-btn-addCart').addClass('is-active');
    }

    $('[data-zoom-image]').elevateZoom();
  }

  // 一覧ページ
  if (page_type == 'page_list') {
    const item_list = createDom(getItemList(param_key));

    $('[data-more-list="items"]').append(item_list);
    $('.jsi-price-select').on('change', function () {
      $('#price-form').submit();
    });
  }

  // ピックアップリスト作成
  const item_list_pickup = createDom(pickUpShuffle(item_data));

  $('[data-item-list="pickup"]').append(item_list_pickup);


  // モーダル実装
  $('.jsi-elem-trigger-strage').on('click', function (e) {
    e.preventDefault(); // aタグの遷移する能力を打ち消す

    $('.jsc-elem-fadeToggle').addClass('is-active');
    // スマホ用
    $('.jsc-elem-change, .jsc-elem-slideIn').removeClass('is-active');
  });


  $('.jsi-elem-close').on('click', function (e) {
    e.preventDefault(); // aタグの遷移する能力を打ち消す

    $('.jsc-elem-fadeToggle').removeClass('is-active');
  });

  // もっと見るボタン実装
  $('[data-more-btn="brand"]').on('click', function () {
    moreControl($(this), 3);
  });

  $('[data-more-btn="items"]').on('click', function () {
    moreControl($(this), 10);
  });
})
No one still commented. Please first comment.
Output