I have a the grid of html elements, each with a data-category attribute on it.
Some data-category attributes have multiple values, separated by comma: data-category="category 2, category 3".
Some have single values: data-category="category 1", without a separator.
I use this simple script to filter the elements by category:
$('#category-selector').on('change', function(){
var $item = $('#items-container').find('.item'),
current = $(this).val();
if(current == 'all'){
$item.fadeIn(200);
} else {
$item.hide(200);
$item.each(function(){
var category = $(this).data('category').split(', ');
//console.log(category);
if($.inArray(current, category) >= 0){
$(this).fadeIn(200);
}
});
}
});
.posts-grid {
margin-top: 25px;
}
.posts-grid>[class*='col-'] {
display: flex;
flex-direction: column;
margin-bottom: 25px;
}
.posts-grid .block {
background: #fff;
border-top: 1px solid #d5d5d5;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.11);
}
.posts-grid p {
margin: 0;
text-align: center;
}
.posts-grid .block {
flex-grow: 1;
display: flex;
justify-content: center;
flex-direction: column;
}
.posts-grid .read-more {
margin-top: auto;
}
@media (max-width: 767px) {
.container {
max-width: 100%;
}
}
@media (max-width: 575px) {
.container {
max-width: 100%;
padding-left: 0;
padding-right: 0;
}
.posts-grid>[class*='col-'] {
padding-left: 5px;
padding-right: 5px;
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" rel="stylesheet" />
<select id="category-selector">
<option value="all">Select Category</option>
<option value="category 1">Category 1</option>
<option value="category 2">Category 2</option>
<option value="category 3">Category 3</option>
</select>
<div class="container" id="items-container">
<div class="posts-grid row">
<div class="item col-xs-12 col-sm-6 col-lg-4 col-xl-3" data-category="category 1, category 2">
<div class="block">
<div class="block">
<p>1</p>
<p>2</p>
</div>
</div>
</div>
<div class="item col-xs-12 col-sm-6 col-lg-4 col-xl-3" data-category="category 2, category 3">
<div class="block">
<p>2</p>
<p>3</p>
</div>
</div>
<div class="item col-xs-12 col-sm-6 col-lg-4 col-xl-3" data-category="category 1, category 3">
<div class="block">
<p>1</p>
<p>3</p>
</div>
</div>
<div class="item col-xs-12 col-sm-6 col-lg-4 col-xl-3" data-category="category 1">
<div class="block">
<div class="block">
<p>1</p>
</div>
</div>
</div>
<div class="item col-xs-12 col-sm-6 col-lg-4 col-xl-3" data-category="category 2">
<div class="block">
<p>2</p>
</div>
</div>
<div class="item col-xs-12 col-sm-6 col-lg-4 col-xl-3" data-category="category 1">
<div class="block">
<p>1</p>
</div>
</div>
<div class="item col-xs-12 col-sm-6 col-lg-4 col-xl-3" data-category="category 1">
<div class="block">
<p>1</p>
</div>
</div>
<div class="item col-xs-12 col-sm-6 col-lg-4 col-xl-3" data-category="category 1">
<div class="block">
<p>1</p>
</div>
</div>
<div class="item col-xs-12 col-sm-6 col-lg-4 col-xl-3" data-category="category 1">
<div class="block">
<p>1</p>
</div>
</div>
<div class="item col-xs-12 col-sm-6 col-lg-4 col-xl-3" data-category="category 1, category 2">
<div class="block">
<p>1</p>
<p>2</p>
</div>
</div>
<div class="item col-xs-12 col-sm-6 col-lg-4 col-xl-3" data-category="category 2, category 3">
<div class="block">
<p>2</p>
<p>3</p>
</div>
</div>
<div class="item col-xs-12 col-sm-6 col-lg-4 col-xl-3" data-category="category 1">
<div class="block">
<p>1</p>
</div>
</div>
</div>
</div>
I was (pleasantly) surprised that my split(', ') method returns an array even if there is no separator.
Questions:
- Why does this happen?
- Is my filter reliable?