Checkbox filter products with jquery and keep state with reload
up vote
0
down vote
favorite
I want to create a page where I can filter products with checkboxes but also to keep the filter choices on page reload.
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="1" value="option1" >
<label for="1">Adidas</label>
</div>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="2" value="option2" >
<label for="1">Nike</label>
</div>
<script>
var checkboxValues = JSON.parse(localStorage.getItem('checkboxValues')) || {},
$checkboxes = $("#checkbox-container :checkbox");
$checkboxes.on("change", function(){
$checkboxes.each(function(){
checkboxValues[this.id] = this.checked;
});
localStorage.setItem("checkboxValues", JSON.stringify(checkboxValues));
});
// On page load
$.each(checkboxValues, function(key, value) {
$("#" + key).prop('checked', value);
});
$('input[type="checkbox"]').change(function() {
if ($('input[type="checkbox"]:checked').length > 0) {
$('.products >div').hide();
$('input[type="checkbox"]:checked').each(function() {
$('.products >div[data-category=' + this.id + ']').show();
});
} else {
$('.products >div').show();
}
});
</script>
I have found both jquery scripts and they both work fine by themselves. By this I mean that I can get to filter the products when checking/unchecking the checkboxes. When checking a checkbox and reloading the page, the checkbox is correctly checked but products has not been filtered. So I need to merge the 2 scripts so that products also will be filtered when reloading the page with a checked checkbox.
Hope someone can guide me a bit here.
--- UPDATE ---
I have created an example here: maxie.dk/filter.php
1) Tick a checkbox
2) Product filter is activated and only products with matching value is displayed
3) Refresh page
4) Checkbox checked is kept as it should but all products are now again visible. Only matching products to the ticked checkbox should be visible.
Thanks
javascript jquery
add a comment |
up vote
0
down vote
favorite
I want to create a page where I can filter products with checkboxes but also to keep the filter choices on page reload.
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="1" value="option1" >
<label for="1">Adidas</label>
</div>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="2" value="option2" >
<label for="1">Nike</label>
</div>
<script>
var checkboxValues = JSON.parse(localStorage.getItem('checkboxValues')) || {},
$checkboxes = $("#checkbox-container :checkbox");
$checkboxes.on("change", function(){
$checkboxes.each(function(){
checkboxValues[this.id] = this.checked;
});
localStorage.setItem("checkboxValues", JSON.stringify(checkboxValues));
});
// On page load
$.each(checkboxValues, function(key, value) {
$("#" + key).prop('checked', value);
});
$('input[type="checkbox"]').change(function() {
if ($('input[type="checkbox"]:checked').length > 0) {
$('.products >div').hide();
$('input[type="checkbox"]:checked').each(function() {
$('.products >div[data-category=' + this.id + ']').show();
});
} else {
$('.products >div').show();
}
});
</script>
I have found both jquery scripts and they both work fine by themselves. By this I mean that I can get to filter the products when checking/unchecking the checkboxes. When checking a checkbox and reloading the page, the checkbox is correctly checked but products has not been filtered. So I need to merge the 2 scripts so that products also will be filtered when reloading the page with a checked checkbox.
Hope someone can guide me a bit here.
--- UPDATE ---
I have created an example here: maxie.dk/filter.php
1) Tick a checkbox
2) Product filter is activated and only products with matching value is displayed
3) Refresh page
4) Checkbox checked is kept as it should but all products are now again visible. Only matching products to the ticked checkbox should be visible.
Thanks
javascript jquery
More explanation is needed here.
– Mark Adesina Omoniyi
Nov 22 at 13:37
I am sorry for not explaining thorough enough. I have created an example here: maxie.dk/filter.php 1) Tick a checkbox 2) Product filter is activated and only products with matching value is displayed 3) Refresh page 4) Checkbox checked is kept as it should but all products are shown. Only matching products should be visible
– MazeyMazey
Nov 22 at 15:00
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I want to create a page where I can filter products with checkboxes but also to keep the filter choices on page reload.
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="1" value="option1" >
<label for="1">Adidas</label>
</div>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="2" value="option2" >
<label for="1">Nike</label>
</div>
<script>
var checkboxValues = JSON.parse(localStorage.getItem('checkboxValues')) || {},
$checkboxes = $("#checkbox-container :checkbox");
$checkboxes.on("change", function(){
$checkboxes.each(function(){
checkboxValues[this.id] = this.checked;
});
localStorage.setItem("checkboxValues", JSON.stringify(checkboxValues));
});
// On page load
$.each(checkboxValues, function(key, value) {
$("#" + key).prop('checked', value);
});
$('input[type="checkbox"]').change(function() {
if ($('input[type="checkbox"]:checked').length > 0) {
$('.products >div').hide();
$('input[type="checkbox"]:checked').each(function() {
$('.products >div[data-category=' + this.id + ']').show();
});
} else {
$('.products >div').show();
}
});
</script>
I have found both jquery scripts and they both work fine by themselves. By this I mean that I can get to filter the products when checking/unchecking the checkboxes. When checking a checkbox and reloading the page, the checkbox is correctly checked but products has not been filtered. So I need to merge the 2 scripts so that products also will be filtered when reloading the page with a checked checkbox.
Hope someone can guide me a bit here.
--- UPDATE ---
I have created an example here: maxie.dk/filter.php
1) Tick a checkbox
2) Product filter is activated and only products with matching value is displayed
3) Refresh page
4) Checkbox checked is kept as it should but all products are now again visible. Only matching products to the ticked checkbox should be visible.
Thanks
javascript jquery
I want to create a page where I can filter products with checkboxes but also to keep the filter choices on page reload.
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="1" value="option1" >
<label for="1">Adidas</label>
</div>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="2" value="option2" >
<label for="1">Nike</label>
</div>
<script>
var checkboxValues = JSON.parse(localStorage.getItem('checkboxValues')) || {},
$checkboxes = $("#checkbox-container :checkbox");
$checkboxes.on("change", function(){
$checkboxes.each(function(){
checkboxValues[this.id] = this.checked;
});
localStorage.setItem("checkboxValues", JSON.stringify(checkboxValues));
});
// On page load
$.each(checkboxValues, function(key, value) {
$("#" + key).prop('checked', value);
});
$('input[type="checkbox"]').change(function() {
if ($('input[type="checkbox"]:checked').length > 0) {
$('.products >div').hide();
$('input[type="checkbox"]:checked').each(function() {
$('.products >div[data-category=' + this.id + ']').show();
});
} else {
$('.products >div').show();
}
});
</script>
I have found both jquery scripts and they both work fine by themselves. By this I mean that I can get to filter the products when checking/unchecking the checkboxes. When checking a checkbox and reloading the page, the checkbox is correctly checked but products has not been filtered. So I need to merge the 2 scripts so that products also will be filtered when reloading the page with a checked checkbox.
Hope someone can guide me a bit here.
--- UPDATE ---
I have created an example here: maxie.dk/filter.php
1) Tick a checkbox
2) Product filter is activated and only products with matching value is displayed
3) Refresh page
4) Checkbox checked is kept as it should but all products are now again visible. Only matching products to the ticked checkbox should be visible.
Thanks
javascript jquery
javascript jquery
edited Nov 22 at 15:03
asked Nov 22 at 13:25
MazeyMazey
608
608
More explanation is needed here.
– Mark Adesina Omoniyi
Nov 22 at 13:37
I am sorry for not explaining thorough enough. I have created an example here: maxie.dk/filter.php 1) Tick a checkbox 2) Product filter is activated and only products with matching value is displayed 3) Refresh page 4) Checkbox checked is kept as it should but all products are shown. Only matching products should be visible
– MazeyMazey
Nov 22 at 15:00
add a comment |
More explanation is needed here.
– Mark Adesina Omoniyi
Nov 22 at 13:37
I am sorry for not explaining thorough enough. I have created an example here: maxie.dk/filter.php 1) Tick a checkbox 2) Product filter is activated and only products with matching value is displayed 3) Refresh page 4) Checkbox checked is kept as it should but all products are shown. Only matching products should be visible
– MazeyMazey
Nov 22 at 15:00
More explanation is needed here.
– Mark Adesina Omoniyi
Nov 22 at 13:37
More explanation is needed here.
– Mark Adesina Omoniyi
Nov 22 at 13:37
I am sorry for not explaining thorough enough. I have created an example here: maxie.dk/filter.php 1) Tick a checkbox 2) Product filter is activated and only products with matching value is displayed 3) Refresh page 4) Checkbox checked is kept as it should but all products are shown. Only matching products should be visible
– MazeyMazey
Nov 22 at 15:00
I am sorry for not explaining thorough enough. I have created an example here: maxie.dk/filter.php 1) Tick a checkbox 2) Product filter is activated and only products with matching value is displayed 3) Refresh page 4) Checkbox checked is kept as it should but all products are shown. Only matching products should be visible
– MazeyMazey
Nov 22 at 15:00
add a comment |
2 Answers
2
active
oldest
votes
up vote
0
down vote
If I get your issue right - you want to move your "business logic" that happens on each input change to a separate function so that it can be executed also upon page reload.
...
// On page load
$.each(checkboxValues, function(key, value) {
$("#" + key).prop('checked', value);
});
// your business logic
function updateProducts() {
if ($('input[type="checkbox"]:checked').length > 0) {
$('.products >div').hide();
$('input[type="checkbox"]:checked').each(function() {
$('.products >div[data-category=' + this.id + ']').show();
});
} else {
$('.products >div').show();
}
}
$('input[type="checkbox"]').change(function() {
// execute for each change
updateProducts();
});
// execute on page load
updateProducts()
Hi @Peter Thanks for the answer. I have tried using your script but this does not work as expected. As you also state, what I want to accomplish is having a page initially with all products listed (and checkboxes unchecked). When a checkbox is ticked, only products with the ticked checkboxes data value in attribute will be shown. When user refreshes page, the ticked checkboxes are remembered as well as only the products with checked data value in attribute will be shown. http//www.maxie.dk/filter2.php
– MazeyMazey
Nov 24 at 12:21
add a comment |
up vote
0
down vote
I have re-write this such that it will update the localstorage and also check and show product that is save in localstorage. It will also remove or show product on checked. Check it out.
<div class="col-xs-12 col-sm-12">
<div class="breadcrumb" id="checkbox-container">
<h4 class="visible-xs"></h4>
<span class="hidden-xs"></span>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="1" value="1" />
<label for="1">Adidas</label>
</div>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="2" value="2" />
<label for="2">Reebok</label>
</div>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="3" value="3" /> <label for="3">Nike</label>
</div>
´
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="1" >
PRODUCT 1
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="1">
PRODUCT 2
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="2"
>
PRODUCT 3
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="3"
>
PRODUCT 4
</div>
</div>
var checkedValues =JSON.parse(localStorage.getItem('checkboxValues')) || ,
$checkboxes = $("#checkbox-container input[type=checkbox]");
function loadPrevious(){
if(checkedValues.length>0){
$("div.products > div").hide();
$.each(checkedValues,function(i,v){
$("#checkbox-container input[type=checkbox]#" + v ).prop('checked',true);
$('.products >div[data-category=' + v + ']').show();
})
}
}
loadPrevious();
$checkboxes.change(function(e) {
e.preventDefault();
if($(this).prop("checked") == true){
checkedValues.push($(this).attr("id"));
loadPrevious();
localStorage.setItem("checkboxValues", JSON.stringify(checkedValues));
}else{
var checkId = $(this).attr("id"),
arr = JSON.parse(localStorage.getItem('checkboxValues'));
$('.products >div[data-category=' + checkId + ']').hide();
var newArr = $(arr).not([checkId]).get();
localStorage.setItem("checkboxValues", JSON.stringify(newArr));
}
});
See the demo here
Thanks for your answer. I have tried updating my example (maxie.dk/filter.php) with your script, but this does not work. The filter does not respond on first tick in a checkbox and also when refreshing the page the products are reset to show all products. Could you have a look?
– MazeyMazey
Nov 24 at 11:44
Check the jsFiddle sample
– Mark Adesina Omoniyi
Nov 25 at 5:50
Yes - very close @Mark. I am trying to reverse the logic with the checkboxes in your script so initially none is ticked but ALL products are shown. Only when activating/ticking the first checkbox, the sorting starts. I can't get your script to do so.
– MazeyMazey
Nov 25 at 8:19
If I get you right, you want to hide all products until checkbox is checked. If that is what you want then why do you now save checked history to localstorage?
– Mark Adesina Omoniyi
Nov 27 at 7:14
I do not want to hide products. I want the opposite. I want all products to be shown when page is initially loaded. When user ticks a checkbox only products with data-attribute value from checkbox is visible. What I want to accomplish is having a page initially with all products listed (and checkboxes unchecked). When a checkbox is ticked, only products with the ticked checkboxes data value in attribute will be shown. When user refreshes page, the ticked checkboxes are remembered as well as only the products with checked data value in attribute will be shown.
– MazeyMazey
Nov 27 at 8:36
|
show 2 more comments
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
If I get your issue right - you want to move your "business logic" that happens on each input change to a separate function so that it can be executed also upon page reload.
...
// On page load
$.each(checkboxValues, function(key, value) {
$("#" + key).prop('checked', value);
});
// your business logic
function updateProducts() {
if ($('input[type="checkbox"]:checked').length > 0) {
$('.products >div').hide();
$('input[type="checkbox"]:checked').each(function() {
$('.products >div[data-category=' + this.id + ']').show();
});
} else {
$('.products >div').show();
}
}
$('input[type="checkbox"]').change(function() {
// execute for each change
updateProducts();
});
// execute on page load
updateProducts()
Hi @Peter Thanks for the answer. I have tried using your script but this does not work as expected. As you also state, what I want to accomplish is having a page initially with all products listed (and checkboxes unchecked). When a checkbox is ticked, only products with the ticked checkboxes data value in attribute will be shown. When user refreshes page, the ticked checkboxes are remembered as well as only the products with checked data value in attribute will be shown. http//www.maxie.dk/filter2.php
– MazeyMazey
Nov 24 at 12:21
add a comment |
up vote
0
down vote
If I get your issue right - you want to move your "business logic" that happens on each input change to a separate function so that it can be executed also upon page reload.
...
// On page load
$.each(checkboxValues, function(key, value) {
$("#" + key).prop('checked', value);
});
// your business logic
function updateProducts() {
if ($('input[type="checkbox"]:checked').length > 0) {
$('.products >div').hide();
$('input[type="checkbox"]:checked').each(function() {
$('.products >div[data-category=' + this.id + ']').show();
});
} else {
$('.products >div').show();
}
}
$('input[type="checkbox"]').change(function() {
// execute for each change
updateProducts();
});
// execute on page load
updateProducts()
Hi @Peter Thanks for the answer. I have tried using your script but this does not work as expected. As you also state, what I want to accomplish is having a page initially with all products listed (and checkboxes unchecked). When a checkbox is ticked, only products with the ticked checkboxes data value in attribute will be shown. When user refreshes page, the ticked checkboxes are remembered as well as only the products with checked data value in attribute will be shown. http//www.maxie.dk/filter2.php
– MazeyMazey
Nov 24 at 12:21
add a comment |
up vote
0
down vote
up vote
0
down vote
If I get your issue right - you want to move your "business logic" that happens on each input change to a separate function so that it can be executed also upon page reload.
...
// On page load
$.each(checkboxValues, function(key, value) {
$("#" + key).prop('checked', value);
});
// your business logic
function updateProducts() {
if ($('input[type="checkbox"]:checked').length > 0) {
$('.products >div').hide();
$('input[type="checkbox"]:checked').each(function() {
$('.products >div[data-category=' + this.id + ']').show();
});
} else {
$('.products >div').show();
}
}
$('input[type="checkbox"]').change(function() {
// execute for each change
updateProducts();
});
// execute on page load
updateProducts()
If I get your issue right - you want to move your "business logic" that happens on each input change to a separate function so that it can be executed also upon page reload.
...
// On page load
$.each(checkboxValues, function(key, value) {
$("#" + key).prop('checked', value);
});
// your business logic
function updateProducts() {
if ($('input[type="checkbox"]:checked').length > 0) {
$('.products >div').hide();
$('input[type="checkbox"]:checked').each(function() {
$('.products >div[data-category=' + this.id + ']').show();
});
} else {
$('.products >div').show();
}
}
$('input[type="checkbox"]').change(function() {
// execute for each change
updateProducts();
});
// execute on page load
updateProducts()
answered Nov 22 at 13:44
Peter Pajchl
2,2091624
2,2091624
Hi @Peter Thanks for the answer. I have tried using your script but this does not work as expected. As you also state, what I want to accomplish is having a page initially with all products listed (and checkboxes unchecked). When a checkbox is ticked, only products with the ticked checkboxes data value in attribute will be shown. When user refreshes page, the ticked checkboxes are remembered as well as only the products with checked data value in attribute will be shown. http//www.maxie.dk/filter2.php
– MazeyMazey
Nov 24 at 12:21
add a comment |
Hi @Peter Thanks for the answer. I have tried using your script but this does not work as expected. As you also state, what I want to accomplish is having a page initially with all products listed (and checkboxes unchecked). When a checkbox is ticked, only products with the ticked checkboxes data value in attribute will be shown. When user refreshes page, the ticked checkboxes are remembered as well as only the products with checked data value in attribute will be shown. http//www.maxie.dk/filter2.php
– MazeyMazey
Nov 24 at 12:21
Hi @Peter Thanks for the answer. I have tried using your script but this does not work as expected. As you also state, what I want to accomplish is having a page initially with all products listed (and checkboxes unchecked). When a checkbox is ticked, only products with the ticked checkboxes data value in attribute will be shown. When user refreshes page, the ticked checkboxes are remembered as well as only the products with checked data value in attribute will be shown. http//www.maxie.dk/filter2.php
– MazeyMazey
Nov 24 at 12:21
Hi @Peter Thanks for the answer. I have tried using your script but this does not work as expected. As you also state, what I want to accomplish is having a page initially with all products listed (and checkboxes unchecked). When a checkbox is ticked, only products with the ticked checkboxes data value in attribute will be shown. When user refreshes page, the ticked checkboxes are remembered as well as only the products with checked data value in attribute will be shown. http//www.maxie.dk/filter2.php
– MazeyMazey
Nov 24 at 12:21
add a comment |
up vote
0
down vote
I have re-write this such that it will update the localstorage and also check and show product that is save in localstorage. It will also remove or show product on checked. Check it out.
<div class="col-xs-12 col-sm-12">
<div class="breadcrumb" id="checkbox-container">
<h4 class="visible-xs"></h4>
<span class="hidden-xs"></span>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="1" value="1" />
<label for="1">Adidas</label>
</div>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="2" value="2" />
<label for="2">Reebok</label>
</div>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="3" value="3" /> <label for="3">Nike</label>
</div>
´
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="1" >
PRODUCT 1
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="1">
PRODUCT 2
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="2"
>
PRODUCT 3
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="3"
>
PRODUCT 4
</div>
</div>
var checkedValues =JSON.parse(localStorage.getItem('checkboxValues')) || ,
$checkboxes = $("#checkbox-container input[type=checkbox]");
function loadPrevious(){
if(checkedValues.length>0){
$("div.products > div").hide();
$.each(checkedValues,function(i,v){
$("#checkbox-container input[type=checkbox]#" + v ).prop('checked',true);
$('.products >div[data-category=' + v + ']').show();
})
}
}
loadPrevious();
$checkboxes.change(function(e) {
e.preventDefault();
if($(this).prop("checked") == true){
checkedValues.push($(this).attr("id"));
loadPrevious();
localStorage.setItem("checkboxValues", JSON.stringify(checkedValues));
}else{
var checkId = $(this).attr("id"),
arr = JSON.parse(localStorage.getItem('checkboxValues'));
$('.products >div[data-category=' + checkId + ']').hide();
var newArr = $(arr).not([checkId]).get();
localStorage.setItem("checkboxValues", JSON.stringify(newArr));
}
});
See the demo here
Thanks for your answer. I have tried updating my example (maxie.dk/filter.php) with your script, but this does not work. The filter does not respond on first tick in a checkbox and also when refreshing the page the products are reset to show all products. Could you have a look?
– MazeyMazey
Nov 24 at 11:44
Check the jsFiddle sample
– Mark Adesina Omoniyi
Nov 25 at 5:50
Yes - very close @Mark. I am trying to reverse the logic with the checkboxes in your script so initially none is ticked but ALL products are shown. Only when activating/ticking the first checkbox, the sorting starts. I can't get your script to do so.
– MazeyMazey
Nov 25 at 8:19
If I get you right, you want to hide all products until checkbox is checked. If that is what you want then why do you now save checked history to localstorage?
– Mark Adesina Omoniyi
Nov 27 at 7:14
I do not want to hide products. I want the opposite. I want all products to be shown when page is initially loaded. When user ticks a checkbox only products with data-attribute value from checkbox is visible. What I want to accomplish is having a page initially with all products listed (and checkboxes unchecked). When a checkbox is ticked, only products with the ticked checkboxes data value in attribute will be shown. When user refreshes page, the ticked checkboxes are remembered as well as only the products with checked data value in attribute will be shown.
– MazeyMazey
Nov 27 at 8:36
|
show 2 more comments
up vote
0
down vote
I have re-write this such that it will update the localstorage and also check and show product that is save in localstorage. It will also remove or show product on checked. Check it out.
<div class="col-xs-12 col-sm-12">
<div class="breadcrumb" id="checkbox-container">
<h4 class="visible-xs"></h4>
<span class="hidden-xs"></span>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="1" value="1" />
<label for="1">Adidas</label>
</div>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="2" value="2" />
<label for="2">Reebok</label>
</div>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="3" value="3" /> <label for="3">Nike</label>
</div>
´
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="1" >
PRODUCT 1
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="1">
PRODUCT 2
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="2"
>
PRODUCT 3
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="3"
>
PRODUCT 4
</div>
</div>
var checkedValues =JSON.parse(localStorage.getItem('checkboxValues')) || ,
$checkboxes = $("#checkbox-container input[type=checkbox]");
function loadPrevious(){
if(checkedValues.length>0){
$("div.products > div").hide();
$.each(checkedValues,function(i,v){
$("#checkbox-container input[type=checkbox]#" + v ).prop('checked',true);
$('.products >div[data-category=' + v + ']').show();
})
}
}
loadPrevious();
$checkboxes.change(function(e) {
e.preventDefault();
if($(this).prop("checked") == true){
checkedValues.push($(this).attr("id"));
loadPrevious();
localStorage.setItem("checkboxValues", JSON.stringify(checkedValues));
}else{
var checkId = $(this).attr("id"),
arr = JSON.parse(localStorage.getItem('checkboxValues'));
$('.products >div[data-category=' + checkId + ']').hide();
var newArr = $(arr).not([checkId]).get();
localStorage.setItem("checkboxValues", JSON.stringify(newArr));
}
});
See the demo here
Thanks for your answer. I have tried updating my example (maxie.dk/filter.php) with your script, but this does not work. The filter does not respond on first tick in a checkbox and also when refreshing the page the products are reset to show all products. Could you have a look?
– MazeyMazey
Nov 24 at 11:44
Check the jsFiddle sample
– Mark Adesina Omoniyi
Nov 25 at 5:50
Yes - very close @Mark. I am trying to reverse the logic with the checkboxes in your script so initially none is ticked but ALL products are shown. Only when activating/ticking the first checkbox, the sorting starts. I can't get your script to do so.
– MazeyMazey
Nov 25 at 8:19
If I get you right, you want to hide all products until checkbox is checked. If that is what you want then why do you now save checked history to localstorage?
– Mark Adesina Omoniyi
Nov 27 at 7:14
I do not want to hide products. I want the opposite. I want all products to be shown when page is initially loaded. When user ticks a checkbox only products with data-attribute value from checkbox is visible. What I want to accomplish is having a page initially with all products listed (and checkboxes unchecked). When a checkbox is ticked, only products with the ticked checkboxes data value in attribute will be shown. When user refreshes page, the ticked checkboxes are remembered as well as only the products with checked data value in attribute will be shown.
– MazeyMazey
Nov 27 at 8:36
|
show 2 more comments
up vote
0
down vote
up vote
0
down vote
I have re-write this such that it will update the localstorage and also check and show product that is save in localstorage. It will also remove or show product on checked. Check it out.
<div class="col-xs-12 col-sm-12">
<div class="breadcrumb" id="checkbox-container">
<h4 class="visible-xs"></h4>
<span class="hidden-xs"></span>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="1" value="1" />
<label for="1">Adidas</label>
</div>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="2" value="2" />
<label for="2">Reebok</label>
</div>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="3" value="3" /> <label for="3">Nike</label>
</div>
´
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="1" >
PRODUCT 1
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="1">
PRODUCT 2
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="2"
>
PRODUCT 3
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="3"
>
PRODUCT 4
</div>
</div>
var checkedValues =JSON.parse(localStorage.getItem('checkboxValues')) || ,
$checkboxes = $("#checkbox-container input[type=checkbox]");
function loadPrevious(){
if(checkedValues.length>0){
$("div.products > div").hide();
$.each(checkedValues,function(i,v){
$("#checkbox-container input[type=checkbox]#" + v ).prop('checked',true);
$('.products >div[data-category=' + v + ']').show();
})
}
}
loadPrevious();
$checkboxes.change(function(e) {
e.preventDefault();
if($(this).prop("checked") == true){
checkedValues.push($(this).attr("id"));
loadPrevious();
localStorage.setItem("checkboxValues", JSON.stringify(checkedValues));
}else{
var checkId = $(this).attr("id"),
arr = JSON.parse(localStorage.getItem('checkboxValues'));
$('.products >div[data-category=' + checkId + ']').hide();
var newArr = $(arr).not([checkId]).get();
localStorage.setItem("checkboxValues", JSON.stringify(newArr));
}
});
See the demo here
I have re-write this such that it will update the localstorage and also check and show product that is save in localstorage. It will also remove or show product on checked. Check it out.
<div class="col-xs-12 col-sm-12">
<div class="breadcrumb" id="checkbox-container">
<h4 class="visible-xs"></h4>
<span class="hidden-xs"></span>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="1" value="1" />
<label for="1">Adidas</label>
</div>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="2" value="2" />
<label for="2">Reebok</label>
</div>
<div class="checkbox checkbox-success checkbox-inline ">
<input type="checkbox" id="3" value="3" /> <label for="3">Nike</label>
</div>
´
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="1" >
PRODUCT 1
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="1">
PRODUCT 2
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="2"
>
PRODUCT 3
</div>
</div>
<div class="products">
<div
class="col-xs-6 col-ms-4 col-sm-4 col-md-4 col-lg-3 padding-btm "
data-category="3"
>
PRODUCT 4
</div>
</div>
var checkedValues =JSON.parse(localStorage.getItem('checkboxValues')) || ,
$checkboxes = $("#checkbox-container input[type=checkbox]");
function loadPrevious(){
if(checkedValues.length>0){
$("div.products > div").hide();
$.each(checkedValues,function(i,v){
$("#checkbox-container input[type=checkbox]#" + v ).prop('checked',true);
$('.products >div[data-category=' + v + ']').show();
})
}
}
loadPrevious();
$checkboxes.change(function(e) {
e.preventDefault();
if($(this).prop("checked") == true){
checkedValues.push($(this).attr("id"));
loadPrevious();
localStorage.setItem("checkboxValues", JSON.stringify(checkedValues));
}else{
var checkId = $(this).attr("id"),
arr = JSON.parse(localStorage.getItem('checkboxValues'));
$('.products >div[data-category=' + checkId + ']').hide();
var newArr = $(arr).not([checkId]).get();
localStorage.setItem("checkboxValues", JSON.stringify(newArr));
}
});
See the demo here
edited Nov 27 at 13:14
answered Nov 23 at 16:01
Mark Adesina Omoniyi
162115
162115
Thanks for your answer. I have tried updating my example (maxie.dk/filter.php) with your script, but this does not work. The filter does not respond on first tick in a checkbox and also when refreshing the page the products are reset to show all products. Could you have a look?
– MazeyMazey
Nov 24 at 11:44
Check the jsFiddle sample
– Mark Adesina Omoniyi
Nov 25 at 5:50
Yes - very close @Mark. I am trying to reverse the logic with the checkboxes in your script so initially none is ticked but ALL products are shown. Only when activating/ticking the first checkbox, the sorting starts. I can't get your script to do so.
– MazeyMazey
Nov 25 at 8:19
If I get you right, you want to hide all products until checkbox is checked. If that is what you want then why do you now save checked history to localstorage?
– Mark Adesina Omoniyi
Nov 27 at 7:14
I do not want to hide products. I want the opposite. I want all products to be shown when page is initially loaded. When user ticks a checkbox only products with data-attribute value from checkbox is visible. What I want to accomplish is having a page initially with all products listed (and checkboxes unchecked). When a checkbox is ticked, only products with the ticked checkboxes data value in attribute will be shown. When user refreshes page, the ticked checkboxes are remembered as well as only the products with checked data value in attribute will be shown.
– MazeyMazey
Nov 27 at 8:36
|
show 2 more comments
Thanks for your answer. I have tried updating my example (maxie.dk/filter.php) with your script, but this does not work. The filter does not respond on first tick in a checkbox and also when refreshing the page the products are reset to show all products. Could you have a look?
– MazeyMazey
Nov 24 at 11:44
Check the jsFiddle sample
– Mark Adesina Omoniyi
Nov 25 at 5:50
Yes - very close @Mark. I am trying to reverse the logic with the checkboxes in your script so initially none is ticked but ALL products are shown. Only when activating/ticking the first checkbox, the sorting starts. I can't get your script to do so.
– MazeyMazey
Nov 25 at 8:19
If I get you right, you want to hide all products until checkbox is checked. If that is what you want then why do you now save checked history to localstorage?
– Mark Adesina Omoniyi
Nov 27 at 7:14
I do not want to hide products. I want the opposite. I want all products to be shown when page is initially loaded. When user ticks a checkbox only products with data-attribute value from checkbox is visible. What I want to accomplish is having a page initially with all products listed (and checkboxes unchecked). When a checkbox is ticked, only products with the ticked checkboxes data value in attribute will be shown. When user refreshes page, the ticked checkboxes are remembered as well as only the products with checked data value in attribute will be shown.
– MazeyMazey
Nov 27 at 8:36
Thanks for your answer. I have tried updating my example (maxie.dk/filter.php) with your script, but this does not work. The filter does not respond on first tick in a checkbox and also when refreshing the page the products are reset to show all products. Could you have a look?
– MazeyMazey
Nov 24 at 11:44
Thanks for your answer. I have tried updating my example (maxie.dk/filter.php) with your script, but this does not work. The filter does not respond on first tick in a checkbox and also when refreshing the page the products are reset to show all products. Could you have a look?
– MazeyMazey
Nov 24 at 11:44
Check the jsFiddle sample
– Mark Adesina Omoniyi
Nov 25 at 5:50
Check the jsFiddle sample
– Mark Adesina Omoniyi
Nov 25 at 5:50
Yes - very close @Mark. I am trying to reverse the logic with the checkboxes in your script so initially none is ticked but ALL products are shown. Only when activating/ticking the first checkbox, the sorting starts. I can't get your script to do so.
– MazeyMazey
Nov 25 at 8:19
Yes - very close @Mark. I am trying to reverse the logic with the checkboxes in your script so initially none is ticked but ALL products are shown. Only when activating/ticking the first checkbox, the sorting starts. I can't get your script to do so.
– MazeyMazey
Nov 25 at 8:19
If I get you right, you want to hide all products until checkbox is checked. If that is what you want then why do you now save checked history to localstorage?
– Mark Adesina Omoniyi
Nov 27 at 7:14
If I get you right, you want to hide all products until checkbox is checked. If that is what you want then why do you now save checked history to localstorage?
– Mark Adesina Omoniyi
Nov 27 at 7:14
I do not want to hide products. I want the opposite. I want all products to be shown when page is initially loaded. When user ticks a checkbox only products with data-attribute value from checkbox is visible. What I want to accomplish is having a page initially with all products listed (and checkboxes unchecked). When a checkbox is ticked, only products with the ticked checkboxes data value in attribute will be shown. When user refreshes page, the ticked checkboxes are remembered as well as only the products with checked data value in attribute will be shown.
– MazeyMazey
Nov 27 at 8:36
I do not want to hide products. I want the opposite. I want all products to be shown when page is initially loaded. When user ticks a checkbox only products with data-attribute value from checkbox is visible. What I want to accomplish is having a page initially with all products listed (and checkboxes unchecked). When a checkbox is ticked, only products with the ticked checkboxes data value in attribute will be shown. When user refreshes page, the ticked checkboxes are remembered as well as only the products with checked data value in attribute will be shown.
– MazeyMazey
Nov 27 at 8:36
|
show 2 more comments
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53432004%2fcheckbox-filter-products-with-jquery-and-keep-state-with-reload%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
More explanation is needed here.
– Mark Adesina Omoniyi
Nov 22 at 13:37
I am sorry for not explaining thorough enough. I have created an example here: maxie.dk/filter.php 1) Tick a checkbox 2) Product filter is activated and only products with matching value is displayed 3) Refresh page 4) Checkbox checked is kept as it should but all products are shown. Only matching products should be visible
– MazeyMazey
Nov 22 at 15:00