evgeniy8705
@evgeniy8705
Повелитель вселенной

Как понять решение с множественным выбором (shift + click) элементов в списке?

Сидел вот читал учебник, читал читал, вроде как более менее разбирался о чем читаю, и вот дочитался, встала задача сделать выделение пунктов списка: learn.javascript.ru/task/selectable-list

Попробовал решить. Просто выделение одного пункта сделал. Выделение с ctrl/meta сделал. А вот с shift вообще понять не мог. Думал посмотрю в решение. Думал что станет понятно. Но ничего не прояснилось, и теперь даже с решением ничего понять не могу. Голова уже кругом идет. Капец трудно все дается, как бы я ни старался, вообще уже кажется что не мое это.

В общем помогите разобраться в решении. Хочется понять как решено, а то уже бросить все хочется из за непонимания почти всего.

Там в задаче есть решение, но вот на всякий случай функция выбора с шифтом

function selectFromLast(target) {
  var startElem = lastClickedLi || ul.children[0];

  var isLastClickedBefore = startElem.compareDocumentPosition(target) & 4;

  if (isLastClickedBefore) {
    for (var elem = startElem; elem != target; elem = elem.nextElementSibling) {
      elem.classList.add('selected');
    }
  } else {
    for (var elem = startElem; elem != target; elem = elem.previousElementSibling) {
      elem.classList.add('selected');
    }
  }
  elem.classList.add('selected');
}
  • Вопрос задан
  • 499 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
function selectFromLast(target) {
  // Определяем элемент, с которого начинается выделение
  // Если до этого кликали на какой-то элемент, берём его
  // Иначе берём первый элемент списка
  var startElem = lastClickedLi || ul.children[0];

  // Определяем, находится стартовый элемент до или после выбранного
  // Для этого применяем битовую операцию И
  // https://learn.javascript.ru/compare-document-position
  var isLastClickedBefore = startElem.compareDocumentPosition(target) & 4;

  if (isLastClickedBefore) {
    // Если стартовый элемент расположен перед выбранным, идём от стартового вниз до выбранного
    for (var elem = startElem; elem != target; elem = elem.nextElementSibling) {
      elem.classList.add('selected');
    }
  } else {
    // Если стартовый элемент расположен после выбранного, идём от стартового вверх до выбранного
    for (var elem = startElem; elem != target; elem = elem.previousElementSibling) {
      elem.classList.add('selected');
    }
  }

  // Наконец, устанавливаем класс выбранному элементу
  elem.classList.add('selected');
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы