JS30. Задание 10 Hold Shift and Check Checkboxes


Судя по тому, что вижу, задача изменить стиль отмеченных чекбоксом строк. Задача сложной не кажется.

Оказывается, всё не так. На самом деле зачеркнуть и выделить цветом отмеченные чекбоксом строки позволяет css-разметка

input:checked + p {
    background:#F9F9F9;
    text-decoration: line-through;
}


Java Script нужен, чтобы выполнить условие: "  Когда пользователь нажимает флажок, удерживает Shift, а затем нажимает на другой флажок несколькими строками ниже или выше, все флажки между этими двумя флажками должны быть отмечены."

Приступим.

1. Находим все чекбоксы. Так как они имеют разметку <input type="checkbox">, метод для их поиска будет таким:

var checkboxes = document.querySelectorAll('input[type="checkbox"]');

Здесь есть смысл обратить внимание на кавычки. Так как слово "checkbox" у нас в двойных кавычках, внешние кавычки должны быть одинарными.

Метод .querySelectorAll() возвращает объект NodeList. Чтобы перебрать все его элементы используем метод forEach()

checkboxes.forEach(checkbox => checkbox.addEventListener("click", function() {
    console.log("1");
}));


console.log("1"); используется только для проверки работает ли этот метод. По цифре в консоли видим, что да.

Осталось самое сложное: написать функцию, которая, если зажата клавиша Shift, будет отмечать все чекбоксы между двумя отмеченными.

Создаём переменную

var lastChecked;

Создаём функцию 

function handleCheck(event) {
    

}

Создаём переменную


var inBetween = false;

Проверяем два условия: 
1) что была зажата клавиша Shift

event.shiftKey

Свойство event.shiftKey позволяет узнать нажата клавиша Shift во время события.  
Есть аналогичные свойства  event.ctrlKey, event.altKey, которые отлавливают нажатие клавиш Ctrl и Alt. 


2) что был отмечен чекбокс 

this.checked

Условие полностью:

if (event.shiftKey && this.checked)

Если это условие выполняется...

Дальше будет немного сложно.

Итак, мы начали с того, что отметили один чекбокс (с зажатой клавишей Shift, или нет - без разницы)
С этого момента он становится lastChecked, потому что ниже по коду мы указали:


lastChecked = this;

Дальше мы зажали клавишу  Shift (или она была зажата ещё раньше, не имеет значения) и нажали на ещё один чекбокс. То есть оба условия выполнены: Shift нажат, чекбокс отмечен.

Проходим по всем чекбоксам: 

checkboxes.forEach(checkbox =>

 И между lastChecked и  this.checked меняем значение переменной inBetween 
Она была false, между двумя зажатыми чекбоксами стала true, затем опять стала false:

if (checkbox === this || checkbox === lastChecked) {
                inBetween = !inBetween;


Осталась мелочь: пока  

inBetween == true, отметить чекбоксы галочками:


if (inBetween) {
                checkbox.checked = true;
            }


Код полностью:

var checkboxes = document.querySelectorAll('input[type="checkbox"]');

var lastChecked;


function handleCheck(event) {
    var inBetween = false;
    if (event.shiftKey && this.checked) {
        checkboxes.forEach(checkbox => {
            if (checkbox === this || checkbox === lastChecked) {
                inBetween = !inBetween;
            }

            if (inBetween) {
                checkbox.checked = true;
            }
        });
    }

    lastChecked = this;
}

checkboxes.forEach(checkbox => checkbox.addEventListener("click", handleCheck));