Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Не совпадает разность длин в цикле (https://javascript.ru/forum/events/74693-ne-sovpadaet-raznost-dlin-v-cikle.html)

Alessio18911 01.08.2018 02:27

Не совпадает разность длин в цикле
 
Привет! Есть такая задача: в инпут вводятся названия стран через запятую. Есть список из 2-х пунктов. При нажатии кнопки, если количество введённых слов больше, чем пунктов, создать и добавить в список новые, чтобы их количество совпадало. Это немного кастрированное описание, т.к. у меня на определённом этапе возникла проблема. Вот разметка:
<input type="text" id="input">
<ul>
    <li></li>
    <li></li>
</ul>
<button id="btn">Вывести значения в списке</button>

Вот код:
var input = document.getElementById('input'),
          ul = document.getElementsByTagName('ul')[0],
        btn = document.getElementById('btn');

btn.onclick = () => {
    var inputValue = input.value.split(',');    
    var li = document.getElementsByTagName('li');
    
    if (inputValue.length == li.length) {
        for (var i = 0; i < li.length; i++) {
    	    li[i].textContent = inputValue[i];
    	}
    } else if (inputValue.length > li.length) {    
         for (var j = 0; j < inputValue.length - li.length; j++) {
    	     var newLi = document.createElement('li');
    	     ul.appendChild(newLi);    			
    	 }    		
    }
 };

И вот проблема: ввожу 4 страны через запятую. Т.е. разница в длине имеющегося списка и количества стран - 2. Если напрямую прописать 2 в цикл строка 14 - всё работает корректно. Если в виде разницы длин, как сейчас, создаёт на 1 пункт меньше. Пытался смотреть через console.log - всё отлично, изначально длина имеющегося списка 2, стран 4, разница, соответственно, 2. А цикл крутится только 1 раз. Подскажите, что за магия!

j0hnik 01.08.2018 02:38

ошибка в том что getElementsByTagName живая коллекция, и с каждой итерацией его length увеличивается.
делайте так.
var x = inputValue.length - li.length;
for (var j = 0; j < x; j++)

рони 01.08.2018 08:58

Alessio18911,
а не проще создавать список из слов, каждый раз заново, и убрать сравнение длин.

Alessio18911 01.08.2018 11:40

Уф... Нежданчик!:) Я знал про "живые" и "неживые" объекты, но до сих пор встречалась обратная ситуация - когда надо было ещё раз перебирать элементы, чтобы "обновить" его. И я думал, что "мёртвость" querySelectorAll - это его отрицательный момент, а "живость" getElements - это неоспоримое преимущество! Оказывается, всё же у каждой медали 2 стороны ) Буду знать, спасибо большое за ответ! :)

Alessio18911 01.08.2018 11:43

Может быть ) Но пока не представляю, как это сделать. И в условии задачи сказано, что пунктов не может быть меньше двух ) Т.е. получается, что если слов больше, то просто создаются новые пункты и вставляются для "невлазящих" слов. А если меньше - то лишние li должны удаляться, но их всегда должно быть минимум 2. Спасибо, что не прошли мимо :)

рони 01.08.2018 17:40

Alessio18911,
а если ввели одно слово тогда как? и откуда взять два первых?

j0hnik 01.08.2018 19:45

Цитата:

Сообщение от рони
а если ввели одно слово тогда как? и откуда взять два первых?

оставить пустые, или дать им undefined :) все по феншую

рони 01.08.2018 19:47

j0hnik,
:-? не осилил ваш ответ, давайте подождём, что ответит автор темы.

j0hnik 01.08.2018 20:04

рони,
юмор :cray:


Часовой пояс GMT +3, время: 13:15.