2017-08-08 7 views
0

JQueryでショッピングカートのような機能を構築しています。これまでのところ、問題なくカートにアイテムを追加したり削除したりすることができます。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です。あなたがデモで見ることができるように、それは動作していません。

誰かが私が間違っていることを理解できますか?

答えて

1

ここでは、ソリューションhttps://codepen.io/Shiladitya/pen/VzpQzM?editors=1010

$(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)); 
 
}
h3 { 
 
    display: inline; 
 
} 
 

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

 
li.well { 
 
    margin: 0 2rem; 
 
}
<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>

これはあなたを助けることを願って行きます。

+0

これは多くの役に立ちます。カートにアイテムが追加されずにアイテムが追加されると、アイテムはページを更新した後でも保持されます。 ただし、永続化されたストアを更新して更新すると、その後の更新時に更新が保持されません。あなたはあなたのためにこれを見ていますか? - アイテム1とアイテム2を追加し、次に更新します。アイテムはそこにあります。すべては順調です。 - アイテム1を削除し、すべてのアイテムが最新表示時にきれいに拭き取られます。 更新後に永続ストアにアイテムを追加する際に、矛盾が発生しています。あなたはこれを見ますか? –

+0

私はそれをチェックさせてください... – Shiladitya

+0

私はcodePen https://codepen.io/Shiladitya/pen/VzpQzMを更新しました。見て... – Shiladitya

1

私はこれについていくつかのステップを教えてくれます。 最初に、追加されたすべてのアイテムを配置するためのアイテムの配列を作成します。 getLocalStorage/setLocalstorageメソッドを記述します。 ページの読み込み時に、項目の配列をチェックします。空の場合は何もせず、長さがある場合は動的テンプレートを作成してulに追加します。

関数に項目を追加している間は、push関数で配列内に項目を追加し続け、同時にlocalstorageに設定します。適切なインデックスで項目を削除する場合は、配列をスプライスします。

解決策が表示されます。上記の手順で試してみてください。

関連する問題