将本地存储或cookie添加到JQuery购物车

时间:2017-08-08 09:48:51

标签: javascript jquery html local-storage

我正在使用JQuery构建类似购物车的功能。到目前为止,我可以毫无问题地在购物车中添加和删除商品。

但是,如果用户刷新页面或决定离开,我希望列表中的项目保持不变。

以下是没有任何本地存储的功能正常的购物车的片段。

$(document).ready(function() {
  $(".btn-primary").click(function(e) {
    $(this).toggleClass("btn-warning");
    toggleText($(this));

    if (!$(`li[data-attribute="${e.target.id}"]`).length) {
      addItem(e.target.id);
    } else {
      $(`li[data-attribute="${e.target.id}"]`).remove();
    }
    setBadge();
    $(".btn-danger").click(function() {
      removeItem($(this).parent("li"));
    });
  });
});

function removeItem(item) {
  $(`#${item.data("attribute")}`).removeClass("btn-warning");
  toggleText($(`#${item.data("attribute")}`));
  item.remove();
  setBadge();
}

function addItem(item) {
  $("ul").append(
    `<li class='well' data-attribute='${item}'>
       ${$(`.${item}-container p`).text()} 
       <button class='btn btn-danger'>-</button>
     </li>`
   );
}

function setBadge() {
  $(".badge").remove();
  $("h3").after("<span class='badge'>" + $("li").length + "</span>");
}

function toggleText(item) {
  if (item.hasClass("btn-warning")) {
    item.text("-");
  } else {
    item.text("+");
  }
}
h3 {
  display: inline;
}

.list-inline {
  padding: 3rem 0;
}

li.well {
  margin: 0 2rem;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<div class="container">
  <div class="row">
    <div class="col-xs-3">
      <div class="well item-1-container">
        <p class="lead">
          Item 1
        </p>
        <button class="btn btn-primary" id="item-1">+</button>
      </div>
    </div>
    <div class="col-xs-3">
      <div class="well item-2-container">
        <p class="lead">
          Item 2
        </p>
        <button class="btn btn-primary" id="item-2">+</button>
      </div>
    </div>
    <div class="col-xs-3">
      <div class="well item-3-container">
        <p class="lead">
          Item 3
        </p>
        <button class="btn btn-primary" id="item-3">+</button>
      </div>
    </div>
    <div class="col-xs-3">
      <div class="well item-4-container">
        <p class="lead">
          Item 4
        </p>
        <button class="btn btn-primary" id="item-4">+</button>
      </div>
    </div>
  </div>
</div>

<hr />

<div class="container">
  <h3>The List </h3>
  <ul class="list-unstyled list-inline"></ul>
</div>

这是 CodePen Demo 我尝试将本地存储合并到购物车中以便存储这些项目。正如您在演示中看到的那样,它无法正常工作。

有人可以帮我弄清楚我做错了什么吗?

2 个答案:

答案 0 :(得分:1)

我可以告诉你一些步骤。 首先制作一系列项目,用于将所有添加的项目放入其中。 编写getLocalStorage / setLocalstorage方法。 在页面加载时,检查项目数组,如果它是空的,什么也不做,如果有一些长度,创建动态模板并附加到ul。

在函数中添加项目时,请通过push函数在数组中添加相同的项目,同时将其设置为localstorage。如果在适当的索引处移除项目,请拼接数组。

您将获得解决方案。请尝试以上步骤。

答案 1 :(得分:1)

您可以使用解决方案https://codepen.io/Shiladitya/pen/VzpQzM?editors=1010

&#13;
&#13;
$(document).ready(function() { 
  
  if(localStorage.getItem("cart") != null){
    var items = JSON.parse(localStorage.getItem("cart")).items;
    for(var i=0; i<items.length; i++){
      addItem(items[i]);
      $('#' + items[i]).toggleClass("btn-warning");
      toggleText(items[i]);
    }
    setBadge();
  }
  
  $(".btn-primary").click(function(e) {
    $(this).toggleClass("btn-warning");
    toggleText($(this).attr('id'));

    if (!$(`li[data-attribute="${e.target.id}"]`).length) {
      addItem(e.target.id);
    } else {
      $(`li[data-attribute="${e.target.id}"]`).remove();
    }
    setBadge();
    setLocalStorage(e.target.id, 0);
    $(".btn-danger").on('click', function() {
      removeItem($(this).parent("li"));
      setLocalStorage($(this).data('id'), 1);
    });
  });
  
  $(".btn-danger").on('click', function() {
    removeItem($(this).parent("li"));
    setLocalStorage($(this).data('id'), 1);
  });
});

function removeItem(item) {
  console.log(item);
  var id = item[0].attributes[1].value;
  $(`#${id}`).removeClass("btn-warning");
  toggleText(id);
  item.remove();
  setBadge();
}

function addItem(item) {
  $("ul").append(
        `<li class='well' data-attribute='${item}'>
${$(`.${item}-container p`).text()} 
<button class='btn btn-danger' data-id='${item}'>-</button>
</li>`
      );  
}

function setBadge() {
  $(".badge").remove();
  $("h3").after("<span class='badge'>" + $("li").length + "</span>");
}

function toggleText(item) {
  if ($('#' + item).hasClass("btn-warning")) {
    $('#' + item).text("-");
  } else {
    $('#' + item).text("+");
  }
}


var cart = {};
cart.items = [];

function setLocalStorage(id, flag) {
  if(flag) {
    cart.items.splice(cart.items.indexOf(id), 1);
  } else {
    cart.items.push(id);
  }
  console.log(JSON.stringify(cart));
  localStorage.setItem("cart", JSON.stringify(cart));
}
&#13;
h3 {
  display: inline;
}

.list-inline {
  padding: 3rem 0;
}

li.well {
  margin: 0 2rem;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<div class="container">
  <div class="row">
    <div class="col-xs-3">
      <div class="well item-1-container">
        <p class="lead">
          Item 1
        </p>
        <button class="btn btn-primary" id="item-1" data-id="item-1">+</button>
      </div>
    </div>
    <div class="col-xs-3">
      <div class="well item-2-container">
        <p class="lead">
          Item 2
        </p>
        <button class="btn btn-primary" id="item-2" data-id="item-2">+</button>
      </div>
    </div>
    <div class="col-xs-3">
      <div class="well item-3-container">
        <p class="lead">
          Item 3
        </p>
        <button class="btn btn-primary" id="item-3" data-id="item-3">+</button>
      </div>
    </div>
    <div class="col-xs-3">
      <div class="well item-4-container">
        <p class="lead">
          Item 4
        </p>
        <button class="btn btn-primary" id="item-4" data-id="item-4">+</button>
      </div>
    </div>
  </div>
</div>

<hr />

<div class="container">
  <h3>The List</h3>
  <ul class="list-unstyled list-inline"></ul>
</div>
&#13;
&#13;
&#13;

希望这会对你有所帮助。