MCM13
MCM13

Reputation: 275

Check for 'checked' checkboxes

Im creating a drop-down with checkboxes, and I want the selected elements to go to an array.

I have them as:

The only part I'm stuck is if you de-select some element then just send the checked ones to the array.

Ex. All elements are selected and I de-select the second option, then the array comes empty instead of containing what was checked.

To get the values of array you need to click the dropdown

Here's my code:

let itemsSelected = []
var checkList = document.getElementById('list1');
var items = document.getElementById('items');
checkList.getElementsByClassName('anchor')[0].onclick = function(evt) {
  if (items.classList.contains('visible')) {
    items.classList.remove('visible');
    items.style.display = "none";
    alert(itemsSelected)
  } else {
    items.classList.add('visible');
    items.style.display = "block";
  }
}

$('.checkValue').change(function() {
  if ($(this).is(':checked')) {
    itemsSelected.push($(this).parent('li').text())
  } else {
    $('.all').prop('checked', false)
    var search_term = 'All';
    var index = itemsSelected.indexOf(search_term); // <-- Not supported in <IE9
    if (index !== -1) {
      itemsSelected.splice(index, 1);
    }
    for (var i = 0; i < itemsSelected.length; i++) {
      if (itemsSelected[i] == $(this).parent('li').text()) {
        itemsSelected.splice(i, 1);
      } else if (!$('.all').is(':checked') && itemsSelected[i] == 'All') {
        itemsSelected.splice(i, 1);
      }
    }
  }
});

$(".all").click(function() {
  $('input:checkbox').not(this).prop('checked', this.checked);
});
.dropdown-check-list {
  display: inline-block;
}

.dropdown-check-list .anchor {
  position: relative;
  cursor: pointer;
  display: inline-block;
  padding: 5px 50px 5px 10px;
  border: 1px solid #ccc;
}

.dropdown-check-list .anchor:after {
  position: absolute;
  content: "";
  border-left: 2px solid black;
  border-top: 2px solid black;
  padding: 5px;
  right: 10px;
  top: 20%;
  -moz-transform: rotate(-135deg);
  -ms-transform: rotate(-135deg);
  -o-transform: rotate(-135deg);
  -webkit-transform: rotate(-135deg);
  transform: rotate(-135deg);
}

.dropdown-check-list .anchor:active:after {
  right: 8px;
  top: 21%;
}

.dropdown-check-list ul.items {
  padding: 2px;
  display: none;
  margin: 0;
  border: 1px solid #ccc;
}

.dropdown-check-list ul.items li {
  list-style: none;
  outline: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="list1" class="dropdown-check-list" tabindex="100">
  <span class="anchor">All</span>
  <ul id="items" class="items">
    <li><input type="checkbox" class="checkValue all" value="All" checked/>All</li>
    <li><input type="checkbox" class="checkValue" value="FirstPlace" checked/>First Place</li>
    <li><input type="checkbox" class="checkValue" value="PlaceSecond" checked/>Second Place </li>
    <li><input type="checkbox" class="checkValue" value="ThirdPlace" checked/>Third Place</li>
    <li><input type="checkbox" class="checkValue" value="FourthPlace" checked/>Fourth Place</li>
  </ul>
</div>

Upvotes: 1

Views: 57

Answers (1)

Nidhin Joseph
Nidhin Joseph

Reputation: 10237

You can use querySelectorAll to get all checked inputs.

document.querySelectorAll('#list1 ul li input:checked');

DEMO

let itemsSelected = []
var checkList = document.getElementById('list1');
var items = document.getElementById('items');
checkList.getElementsByClassName('anchor')[0].onclick = function(evt) {
  if (items.classList.contains('visible')) {
    items.classList.remove('visible');
    items.style.display = "none";
    alert(itemsSelected)
  } else {
    items.classList.add('visible');
    items.style.display = "block";
  }
}

$('.checkValue').change(function() {
  if ($(this).is(':checked')) {
    itemsSelected.push($(this).parent('li').text())
  } else {
    $('.all').prop('checked', false)
    var search_term = 'All';
    var index = itemsSelected.indexOf(search_term); // <-- Not supported in <IE9
    if (index !== -1) {
      itemsSelected.splice(index, 1);
    }
    for (var i = 0; i < itemsSelected.length; i++) {
      if (itemsSelected[i] == $(this).parent('li').text()) {
        itemsSelected.splice(i, 1);
      } else if (!$('.all').is(':checked') && itemsSelected[i] == 'All') {
        itemsSelected.splice(i, 1);
      }
    }
  }
});

$(".all").click(function() {
  $('input:checkbox').not(this).prop('checked', this.checked);
});

function getChecked() {
  let val = document.querySelectorAll('#list1 ul li input:checked');
  val.forEach(e => {
    console.log(e.value)
  })
}
.dropdown-check-list {
  display: inline-block;
}

.dropdown-check-list .anchor {
  position: relative;
  cursor: pointer;
  display: inline-block;
  padding: 5px 50px 5px 10px;
  border: 1px solid #ccc;
}

.dropdown-check-list .anchor:after {
  position: absolute;
  content: "";
  border-left: 2px solid black;
  border-top: 2px solid black;
  padding: 5px;
  right: 10px;
  top: 20%;
  -moz-transform: rotate(-135deg);
  -ms-transform: rotate(-135deg);
  -o-transform: rotate(-135deg);
  -webkit-transform: rotate(-135deg);
  transform: rotate(-135deg);
}

.dropdown-check-list .anchor:active:after {
  right: 8px;
  top: 21%;
}

.dropdown-check-list ul.items {
  padding: 2px;
  display: none;
  margin: 0;
  border: 1px solid #ccc;
}

.dropdown-check-list ul.items li {
  list-style: none;
  outline: none;
}
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>

<div id="list1" class="dropdown-check-list" tabindex="100">
  <span class="anchor">All</span>
  <ul id="items" class="items">
    <li><input type="checkbox" class="checkValue all" value="All" checked/>All</li>
    <li><input type="checkbox" class="checkValue" value="FirstPlace" checked/>First Place</li>
    <li><input type="checkbox" class="checkValue" value="PlaceSecond" checked/>Second Place </li>
    <li><input type="checkbox" class="checkValue" value="ThirdPlace" checked/>Third Place</li>
    <li><input type="checkbox" class="checkValue" value="FourthPlace" checked/>Fourth Place</li>
  </ul>
</div>

<button onclick="getChecked()">
Get Checked
</button>

Upvotes: 1

Related Questions