JackShcherbakov
@JackShcherbakov

Насколько плох код?

Здравствуйте! Решил задачку из учебника Ильи Кантора и получилось как-то все замудренно. Насколько плох этот код? Или все в порядке? Просто меня преследует чувство "костыльности" решения.
spoiler
<!DOCTYPE HTML>
<html>

<head>
  <meta charset="utf-8">
  <style>
    .selected {
      background: #0f0;
    }

    li {
      cursor: pointer;
      user-select:none;
    }
  </style>
</head>

<body>

  Клик на элементе выделяет только его.
  <br> Ctrl(Cmd)+Клик добавляет/убирает элемент из выделенных.
  <br> Shift+Клик добавляет промежуток от последнего кликнутого к выделению.
  <br>

  <ul id="ul">
    <li>Кристофер Робин</li>
    <li>Винни-Пух</li>
    <li>Ослик Иа</li>
    <li>Мудрая Сова</li>
    <li>Кролик. Просто кролик.</li>
  </ul>

  <script>
  let from, to;
    ul.onclick = function(e){
    	let target = e.target;
    	
    	if(target.tagName != "LI") return;
    	if(e.ctrlKey || e.metaKey){
    		for(let i = 0; i<ul.children.length; i++){
       			if(ul.children[i] == target){
       				from = i;
       			}
       		}
    		 target.classList.toggle('selected');
    	}
    	else if(e.shiftKey){	
    		deleteAll(target);
	  		for(let i = 0; i<ul.children.length; i++){
	    		if(ul.children[i] == target) to = i;
	    	}
	   		if(from > to){
	       		let from2 = from;
	       		from = to;
	       		to = from2;
	       	}
	       	for(let a = 0; a<ul.children.length; a++){
	    		if(a>=from && a<=to) ul.children[a].classList.add("selected");
	    	}
    	}
    	else{
        	deleteAll(target);
       		target.classList.toggle("selected");
       		for(let i = 0; i<ul.children.length; i++){
       			if(ul.children[i] == target){
       				from = i;
       			}
       		}
    	}

    }
    function deleteAll(li){
    	for(let i = 0; i<ul.children.length; i++){
    		ul.children[i].classList.remove("selected");
    	}
    }
  </script>

</body>

</html>

Песочница - https://codepen.io/CitizenOne/pen/JMrWww
  • Вопрос задан
  • 272 просмотра
Решения вопроса 2
Xuxicheta
@Xuxicheta
инженер
Начни с малого: у тебя если допустим 1 элемент выбрать просто кликом, 2 элемент выбрать ктрл-клик, а потом 4 элемент кликнуть с шифтом, то выделение 1 элемента сброситься, потому что в from стоит номер 2.
А в условиях стоит " от последнего кликнутого к выделению. "
Ответ написан
y0u
@y0u Куратор тега JavaScript
dev
Кликните на последний пункт. Затем зажмите шифт и кликните на 3 пункт, затем, не отпуская шифт, кликните на первый пункт - у вас выделится первые 3 пункта. Вроде всё правильно исходя из условия. Теперь отпустите шифт и нажмите на первый пункт, зажмите шифт и кликните на 3 пункт, а затем, не отпуская шифт, кликните на последний пункт. У вас выделились все пункты, хотя, по предыдущей логике, должны были выделиться только последние 3 пункта.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
Версия с выделением "как в эксплорере"
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
06 мая 2024, в 09:38
1200 руб./в час
06 мая 2024, в 09:37
1200 руб./в час
06 мая 2024, в 09:36
8000 руб./за проект