Показать сообщение отдельно
  #1 (permalink)  
Старый 31.01.2016, 10:57
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

Выделить интервал элементов (от a до b) двумя кликами
Выделить интервал=промежуток=цепочк у элементов двумя кликами.
<!doctype html>
<meta charset='utf-8'>
<title>EXAMPLE</title>
<div id='box'>
  <div class='el'>1</div>
  <div class='el'>2</div>
  <div class='el'>3</div>
  <div class='el'>4</div>
  <div class='el'>5</div>
  <div class='el'>6</div>
  <div class='el'>7</div>
  <div class='el'>8</div>
  <div class='el'>9</div>
  <div class='el'>X</div>
</div>
<style>
  body {
    display: flex;
    margin: 0;
    height: 100vh;
    background: #56bddc;
  }
  #box {
    display: flex;
    margin: auto;
    box-shadow: 0 0 5px hsla(0, 0%, 0%, .25);
  }
  .el {
    width: 60px;
    line-height: 60px;
    font-family: consolas;
    font-size: 30px;
    text-align: center;
    cursor: pointer;
    background: #fff;
    -webkit-user-select: none;
    -moz-user-select: none;
  }
  .el:hover { background: #fece9a; }
  .mark { background: #fece9a; }
</style>


Неужели в JavaScript нет такой конструкции:
(from a to b) { ... },
где a - элемент, с которого начинается выделение,
b - элемент, на котором заканчивается выделение.

Итак, :
Например, требуется выделить интервал элементов со 2 по 7 включительно.

Тогда делаем всего два клика:
1) клик по элементу номер 2;
2) клик по элементу номер 7.

Результат: 2,3,4,5,6,7 элементы изменят свой цвет согласно полученному классу .mark ( см. <style> ).

Тогда алгоритм будет такой:
1) клик по элементу a:
-> получить номер элемента в контейнере #box;
-> присвоить элементу класс .a;
-> записать номер в переменную a
2) клик по элементу b:
-> получить номер элемента в контейнере #box;
-> присвоить элементу класс .b
-> записать номер в переменную b
3) присвоить элементам от a до b класс .mark, пробежавшись по ним циклом

Хотелось бы решить задачу, используя последние фишки ES6 и желательно обойтись без массивов.
Цикл for-of, который может перебирать коллекции элементов, а не только массивы:
http://frontender.info/es6-in-depth-...ikollektsiyami

Попытки, что-то сделать:

Получение номера (индекса) элемента в контейнере:
box.onmouseover = function(e) {
  var target = e.target;
  target.onclick = function() {
    target.classList.add('a');
    for (var i = 0; i < box.children.length; i++) {
      if (box.children[i] == target) return console.log(i + 1);
    }
  }
}


Может пригодится:
'use strict'
var i,
      j = i + 1,
      parent = box,
      children = parent.children;
// Вместо children можно использовать элементы от a до b
parent.onmouseover = function() {
  for (i of children) {
    i.classList.add('mark');
  }
}


На Киберфоруме я уже задавал этот вопрос, но ответ получился слишком громоздким. Надеюсь здесь удастся решить иначе.
Если кому будет интересно, результат должен быть таким:
http://www.cyberforum.ru/post8673990.html
Надеюсь, что вы поможете. Спасибо.

Последний раз редактировалось Teamur, 31.01.2016 в 12:34.
Ответить с цитированием