localStorage Добавить в корзину - PullRequest
       41

localStorage Добавить в корзину

0 голосов
/ 17 октября 2018

Я создаю простую функцию добавления в корзину , используя jQuery и localStorage.Все работает нормально, но я не могу добавить класс selected к кнопке Добавить в корзину.Пожалуйста, помогите мне добавить и удалить (переключить) класс selected.

Мне нужна логика для установки класса на кнопках в зависимости от того, содержится ли товар в JSON, который я держу в localStorage.

var favorites = JSON.parse(localStorage.getItem('favorites')) || [];
var list = $("#fav-list");
var parent = list.parent();

function addFavList() {
  list.detach().empty().each(function(i) {
    for (var x = 0; x < favorites.length; x++) {
      $(this).append('<li>' + favorites[x] + '</li>');
      if (x == favorites.length - 1) {
        $(this).appendTo(parent);
      }

    }
  });
}

addFavList();

$(document).delegate('.cart', 'click', function(e) {
  var id = $(this).parent().html(),
    index = favorites.indexOf(id);

  if (!id) 
    return;

  if (index == -1) {
    favorites.push(id);
  } else {
    favorites.splice(index, 1);
    $(this).parent().removeClass('fav');
  }

  localStorage.setItem('favorites', JSON.stringify(favorites));
  addFavList();
});


$(document).delegate('#delete', 'click', function() {
  localStorage.clear();
  location.reload();
});

Пожалуйста, отметьте это Скрипка , где я старался изо всех сил

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

У меня есть небольшая тренировка в твоей скрипке, и я думаю, что теперь это может быть, как ты хочешь.

Его теперь переключающий класс selected при удалении и добавлении в корзину.

Я редактировали вот код.

var favorites = JSON.parse(localStorage.getItem('favorites')) || [];


var list = $("#fav-list");
var parent = list.parent();

function addFavList(){
      $(document).find('.cart').removeClass('selected');
      list.detach().empty().each(function(i){

      for (var x = 0; x < favorites.length; x++){
           $(this).append('<li>' + favorites[x] + '</li>');

           $('.list li').each(function(){
               if($(this).html() == favorites[x]){
                   $(this).find('.cart').addClass('selected')
               }
            });
            if (x == favorites.length - 1){
            $(this).appendTo(parent);


           }
       }
    });

}
addFavList();

$(document).delegate('.cart', 'click', function(e){
    $(this).removeClass('selected');
    var id = $(this).parent().html();

    var index = favorites.indexOf(id);


    if (!id) return;
        if (index == -1) {
        favorites.push(id);
        $(this).addClass('selected');
    } 
    else {
       favorites.splice(index, 1);
       $(this).parent().removeClass('fav');
       $(this).removeClass('selected');
    }

    localStorage.setItem('favorites', JSON.stringify(favorites));
    addFavList();
});


$(document).delegate('#delete', 'click', function(){
   localStorage.clear();
   location.reload();   
   $(document).find('.cart').removeClass('selected');
});

Я не уверен, что он вам вполне удовлетворителен, но надеюсь, что он будет полезен.

Вот и ссылка на скрипку.Пожалуйста, попробуйте очистить местное хранилище.https://jsfiddle.net/8adbjstz/75/

0 голосов
/ 21 октября 2018

я бы предложил хранить только имена элементов в массиве localStorage.как ["iPhone","Samsung","Macbook Pro"] не с элементами html-ссылок.это помогает в сравнении при сохранении или получении значений.

проверить обновленный код в jsfiddle https://jsfiddle.net/shivkumar/o9xabdtr/

JavaScript

$(document).ready(function() {

  var favorites = JSON.parse(localStorage.getItem('favorites')) || [];

  var list = $("#fav-list");
  var parent = list.parent();

  function addFavList(){
    list.detach().empty().each(function(i){
        for (var x = 0; x < favorites.length; x++){
        $(this).append('<li><a href="#">'+ favorites[x] + '</a><button class="cart selected">Remove cart</button></li>');
        $(this).appendTo(parent);
            $('.list').find("li:contains("+ favorites[x] +")").find('.cart').addClass('selected');
            $('.list').find("li:contains("+ favorites[x] +")").find('.cart').html('Remove cart');
        }
    });

  }

  addFavList();

  $(document).delegate('.cart', 'click', function(e){

    var item = $(this.parentElement.firstElementChild).text();
    index = favorites.indexOf(item);

    if (!item) return;
    if (index == -1) {
        favorites.push(item);
    }
    else {
      $('.list').find("li:contains("+ favorites[index] +")").find('.cart').removeClass('selected');
      $('.list').find("li:contains("+ favorites[index] +")").find('.cart').html('Add to cart');
      favorites.splice(index, 1);
    }

    localStorage.setItem('favorites', JSON.stringify(favorites));
    addFavList();
  });


  $(document).delegate('#delete', 'click', function(){
     localStorage.clear();
     location.reload();
  });

});

CSS

ul, ul li {
  list-style: none;
  padding: 0;
  margin: 0;
}

a {
  min-width: 110px;
  display: inline-block;
  padding: 0 0 10px 0;
}

.selected {
  background: #333;
  color: #fff;
}

#res, #fav-list {
  margin: 0 0 20px 0;
}

.clearfix {
  clear: both;
}

.cart {
  background: green;
  color: white;
}

.fav {
  border: 1px solid green;
}

.selected {
  background: red;
}

HTML

<html>

<body>

  <ul class="list">
    <li><a href="#">iPhone</a><button class="cart">Add to cart</button></li>
    <li><a href="#">Samsung</a><button class="cart">Add to cart</button></li>
    <li><a href="#">Macbook Pro</a><button class="cart">Add to cart</button></li>
    <li><a href="#">Dell Laptop</a><button class="cart">Add to cart</button></li>
  </ul>

  <div class="clearfix"></div>
  <br/>
  <div id="res">

  Your Cart

    <ul id="fav-list">

    </ul>
    <br/>

  </div>

  <button id="delete">Delete</button>

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

</body>
</html>
0 голосов
/ 24 октября 2018

В некоторых случаях лучше перенести шаги, которые часто повторяются, для работы.Рассмотрим следующий jQuery:

$(function() {
  function getFavData() {
    var data = localStorage.getItem('favorites');
    var fav = JSON.parse(data) || [];
    console.log("Getting Data", fav);
    return fav
  }

  function saveFavData(data) {
    if (typeof data === 'object') {
      data = JSON.stringify(data);
    } else {
      data = JSON.stringify([data]);
    }
    localStorage.setItem('favorites', data);
    console.log("Saving Data", data);
    return true;
  }

  function showFavData(target) {
    var list = getFavData();
    target.empty();
    console.log("Showing Data", target, list);
    $.each(list, function(k, v) {
      $("<li>").html(v).appendTo(target);
    });
  }

  function clearFavData(event) {
    event.preventDefault();
    var res = confirm("Are you sure you want to delete all the items in your Cart?");
    if (res) {
      localStorage.setItem('favorites', '');
      localStorage.clear();
      location.reload();
      console.log("Data Cleared");
    }
  }

  $(".cart").click(function(e) {
    e.preventDefault();
    var list = getFavData();
    var item = $(this).prev("a").text();
    var index = list.indexOf(item);

    if (!item) return;
    if (index == -1) {
      list.push(item);
    } else {
      list.splice(index, 1);
      $(this).parent().removeClass('fav');
    }
    saveFavData(list);
    showFavData($("#fav-list"));
  });

  $('#delete').click(clearFavData);
});

Рабочий пример можно посмотреть здесь:

https://jsfiddle.net/Twisty/3wmvou45/34/

Даже если они маленькие, разделение работы позволяет вамвыполнять эти действия в любой точке вашего сценария.Это может сделать ваш сценарий более понятным и понятным позже, если вам когда-нибудь придется вернуться и перестроить его.Правильные комментарии или хорошие соглашения об именах могут помочь вам определить конкретные задания, которые будет выполнять каждая функция.

В вашем коде также могут быть полезны некоторые дополнительные проверки.Как и при удалении, убедитесь, что пользователь действительно хочет удалить все данные.Или при сохранении данных, убедитесь, что это массив данных, который сохраняется.

Если ваши HTML-элементы не создаются динамически, вам не нужно использовать .delegate().Если HTML генерируется программно, я бы посоветовал использовать .on().

Начиная с jQuery 3.0, .delegate() устарел.Он был заменен методом .on(), начиная с jQuery 1.7, поэтому его использование уже не поощрялось.

Ряд ваших селекторов и код также были неверны.Например:

var id = $(this).parent().html();

В этом фрагменте кода, $(this), относится к нажатой кнопке..parent() выбирает родительский элемент кнопки, который является элементом <li>.Наконец, .html() возвращает innerHTML из <li>.Таким образом, в конце концов, id будет содержать:

<a href="#">iPhone</a><button class="cart">Add to cart</button>

В этом случае произойдет сбой при попытке определить, существует ли этот элемент в массиве.Поскольку вам просто нужна строка "iPhone", вам нужно выбрать .text() элемента <a>.Любой способ может работать для вас:

  • var id = $(this).parent().find("a").text();
  • var id = $(this).prev("a").text();

Надеюсь, что поможет.

0 голосов
/ 17 октября 2018
$(document).delegate('.cart', 'click', function(e){
           ///*** Try using $target to add selected class to button///
             $target = $(e.target);   
            $target.addClass('selected');
    var id = $(this).parent().html(),
    index = favorites.indexOf(id);

    if (!id) return;
        if (index == -1) {
        favorites.push(id);
    } 
    else {
      ///*** Try using $target to remove selected class from button///
        $target.removeClass('selected');
        favorites.splice(index, 1);
        $(this).parent().removeClass('fav');
    }
...