I’m working on my companies legacy project. It uses jQuery. I have to add a feature to it. The feature is that, on clicking a checkbox, a span with the checked value (let’s call it “filtered value”) will be displayed with a “remove” icon in it. On clicking the remove icon of the “filtered value”, filtered value should be removed and corresponding checkbox should be unchecked.
I got the first half working. But REMOVE functionality isn’t working. I get an error “ReferenceError, removeFilter is not defined.” Here is the Codesandbox.
JavaScript
x
35
35
1
var filtersApplied = [];
2
$('.ps-sidebar').on('change', 'input[type=checkbox]', function () {
3
var me = $(this);
4
console.log('me', me);
5
if (me.prop('checked') === true) {
6
filtersApplied.push(me.attr('data-filter-label'));
7
} else {
8
filtersApplied = filtersApplied.filter(function (filter) {
9
return filter !== me.attr('data-filter-label');
10
});
11
}
12
function removeFilter(el, filter) {
13
console.log('im clicked', el);
14
// el.remove();
15
}
16
17
if (filtersApplied.length === 0) {
18
$('.ps-plans__filters').hide();
19
$('.ps-plans__filters-applied').html('');
20
} else {
21
$('.ps-plans__filters').show();
22
var filtersAppliedHtml = '';
23
filtersApplied.forEach(function (filter) {
24
filtersAppliedHtml +=
25
'<span class="ps-plans__filter" id="' +
26
filter +
27
'">' +
28
filter +
29
'<span class="remove" onclick="removeFilter(this, filter)">x</span></span>';
30
});
31
console.log('filtersAppliedHtml', filtersAppliedHtml);
32
$('.ps-plans__filters-applied').html(filtersAppliedHtml);
33
}
34
});
35
Advertisement
Answer
Several problems:
removeFilter()
needs to be declared globally, i.e. outside the “on change” handler.- You need to pass the correct ID to
removeFilter()
. removeFilter()
needs to remove the parent<span>
as well as uncheck the corresponding checkbox.- When clicking the “X” to remove a filter, you need to remove it from the
filtersApplied
array.
Here’s a working model:
JavaScript
1
46
46
1
// https://stackoverflow.com/a/5767357/378779
2
function removeItemOnce(arr, value) {
3
var index = arr.indexOf(value);
4
if (index > -1) {
5
arr.splice(index, 1);
6
}
7
return arr;
8
}
9
10
function removeFilter(el, filter) {
11
console.log('im clicked', el);
12
$('input[id="' + filter + '"]').prop('checked', false)
13
$(el).parent().remove();
14
filtersApplied = removeItemOnce( filtersApplied, filter ); // Remove item from filter
15
}
16
17
var filtersApplied = [];
18
$('.ps-sidebar').on('change', 'input[type=checkbox]', function () {
19
var me = $(this);
20
console.log('me', me);
21
if (me.prop('checked') === true) {
22
filtersApplied.push(me.attr('data-filter-label'));
23
} else {
24
filtersApplied = filtersApplied.filter(function (filter) {
25
return filter !== me.attr('data-filter-label');
26
});
27
}
28
29
if (filtersApplied.length === 0) {
30
$('.ps-plans__filters').hide();
31
$('.ps-plans__filters-applied').html('');
32
} else {
33
$('.ps-plans__filters').show();
34
var filtersAppliedHtml = '';
35
filtersApplied.forEach(function (filter) {
36
filtersAppliedHtml +=
37
'<span class="ps-plans__filter" id="' +
38
filter +
39
'">' +
40
filter +
41
`<span class="remove" onclick="removeFilter(this, '${filter}')">x</span></span>`;
42
});
43
console.log('filtersAppliedHtml', filtersAppliedHtml);
44
$('.ps-plans__filters-applied').html(filtersAppliedHtml);
45
}
46
});
JavaScript
1
22
22
1
.hide {
2
display: none;
3
}
4
.ps-plans__filters-container {
5
margin-top: 30px;
6
}
7
.ps-plans__filter {
8
border: 1px solid #000;
9
border-radius: 4px;
10
padding: 5px 10px;
11
width: 100px;
12
margin-right: 20px;
13
}
14
.remove {
15
border: 1px solid #000;
16
border-radius: 50%;
17
margin-left: 10px;
18
padding-top: 3px;
19
padding-bottom: 3px;
20
padding-right: 5px;
21
padding-left: 5px;
22
}
JavaScript
1
32
32
1
<html>
2
<head>
3
<title>jQuery button interactive sample</title>
4
<meta charset="UTF-8" />
5
<script
6
src="https://code.jquery.com/jquery-3.6.0.js"
7
integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk="
8
crossorigin="anonymous"></script>
9
10
</head>
11
12
<body>
13
<div class="wrapper">
14
<div id="cblist" class="ps-sidebar">
15
<input type="checkbox" value="HSA" id="hsa" data-filter-label="hsa" />
16
<label for="cb1">HSA</label>
17
18
<input type="checkbox" value="PCO" id="pco" data-filter-label="pco" />
19
<label for="cb1">PCO</label>
20
</div>
21
<div class="ps-plans__filters-container">
22
<div class="ps-plans__filters hide">
23
<span class="ps-plans__filters-label">
24
Filtered Value
25
</span>
26
<span class="ps-plans__filters-applied"></span>
27
</div>
28
</div>
29
</div>
30
31
</body>
32
</html>