В вашем коде есть несколько проблем:
- Вы перерабатываете
#checkBox
ID. Помните, что идентификаторы должны быть уникальными в документе. Поэтому вы должны генерировать уникальный идентификатор для каждой пары метка + флажок - Вы удаляете только элемент флажка, а не текст метки, поэтому даже если ваша логика работает, внешний вид / результат вашего кода нечто вы хотите.
Решением будет , заключающий текст вашей метки и элемент флажка внутри метки . Преимущества этого состоят в том, что:
- Элемент
<label>
не нуждается в атрибуте for
, так как нажатие на метку автоматически установит вложенный флажок - Вы можете использовать
.closest('label')
чтобы удалить всю пару текста + флажок метки, когда вы нажмете кнопку удаления
Чтобы перебрать все отмеченные флажки, вы можете просто запустить этот селектор: document.querySelector('.checkbox:checked')
. Чтобы перебрать эту коллекцию узлов, вы можете использовать Array.prototype.forEach()
.
Еще одно примечание: вам может потребоваться возврат из функции , если там предоставлен пустой текст, когда пользователь хочет добавитьтекстовое поле.
См. пример проверки концепции ниже:
function add() {
var myDiv = document.getElementById("myDiv");
var inputValue = document.getElementById("myInput").value;
// creating checkbox element
var checkbox = document.createElement('input');
if (inputValue === '') {
alert("Input is Empty!");
return;
} else {
document.getElementById("myUL").appendChild(checkbox);
}
// Assigning the attributes to created checkbox
checkbox.type = "checkbox";
checkbox.name = "name";
checkbox.value = "value";
checkbox.classList.add("checkbox");
// create label for checkbox
var label = document.createElement('label');
// appending the checkbox and created text to the created label tag
label.appendChild(checkbox);
label.appendChild(document.createTextNode(inputValue));
// appending label to div
myDiv.appendChild(label);
}
function remove() {
const checkboxes = document.querySelectorAll('.checkbox:checked');
Array.prototype.forEach.call(checkboxes, function(checkbox) {
checkbox.closest('label').remove();
});
}
<h1>To Do List</h1>
<input type="text" id="myInput">
<button onclick='add()'>Click me!</button>
<button onclick="remove()">Delete</button>
<ul id="myUL">
<div id="myDiv"></div>
</ul>