Добавление <input> в зависимости от выбора <select>

187
11 января 2019, 01:30

Есть такой код:

const authorNameLabel = document.createElement('div'); 
authorNameLabel.innerHTML = '<lable for="main-name">Фамилия автора</lable> <input name="main-name" id="main-name"/><lable>  Инициалы</lable> <input /> </br></br>' 
 
function runSelect() { 
  const numberOfAuthors = document.querySelector('#number-of-authors').value; 
  switch (numberOfAuthors) { 
    case '1': 
      authorList.appendChild(authorNameLabel); 
      authorList.appendChild(authorNameLabel); 
      break; 
    case '2': 
      authorList.appendChild(authorNameLabel); 
      authorList.appendChild(authorNameLabel); 
      authorList.appendChild(authorNameLabel); 
      break; 
    case '7': 
      for (let i = 0; i < 7; i++) { 
        authorList.appendChild(authorNameLabel); 
      } 
      break; 
    case 'more-then-8': 
      for (let i = 0; i < 6; i++) { 
        authorList.appendChild(authorNameLabel); 
      } 
      authorNameLabel.innerHTML = '<lable for="main-name">Фамилия ПОСЛЕДНЕГО автора</lable> <input name="main-name" id="main-name"/><lable>  Инициалы</lable> <input /> </br></br>' 
      authorList.appendChild(authorNameLabel); 
      break; 
    case 'organisation': 
      authorNameLabel.innerHTML = '<lable for="main-name">Название организации, учреждения, что подготовила монографию <input name="main-name" id="main-name"/> </br></br>' 
      authorList.appendChild(authorNameLabel); 
      break; 
  } 
}
<div id="modal-window"> 
  <div class="form-wrapper"> 
    <form action=""> 
      <div id="authorList"><label>Количество авторов</label> 
        <select id="number-of-authors" name="number-of-authors" onchange="runSelect()"> 
          <option value="1"> 1 автор </option> 
          <option value="2"> 2 автори </option> 
          <option value="7"> от 3 до 7 авторов </option> 
          <option value="more-then-8"> больше 8 авторов </option> 
          <option value="organisation"> Автор неизвестен або колективный автор (учереждение) </option> 
        </select> 
        </br> 
        </br> 
      </div> 
    </form> 
  </div> 
</div>

Пытаюсь добавить в модальное окно форму на js. В зависимости от того, что выберет пользователь в select, ниже должен добавится div с нужными input. Что ни пробовала, создается только один div, более того, когда выбираю 1 автор, совсем не создается ничего, когда последнее (автор неизвестен) то потом не меняется уже на другое, что бы ни выбирала (((

Подскажите, плиз, где ошибка, может логика неправильная. Спасибо!

Answer 1

Посмотрите такой вариант:

// Добавляем новый блок с классом tmp 
function addBlock(html) { 
  var authorNameLabel = document.createElement('div'); 
  authorNameLabel.className = "tmp"; 
  authorNameLabel.innerHTML = (html) ? html : '<lable for="main-name">Фамилия автора</lable> <input class="main-name" /><lable>Инициалы</lable></br></br>'; 
  return authorNameLabel; 
} 
// Очищаем старые блоки с классом tmp  
function removeBlocks() { 
  var blocks = document.querySelectorAll('.tmp'); 
  blocks.forEach(function(el){ 
    el.remove(); 
  }); 
} 
 
var authorList = document.getElementById('authorList'); 
function runSelect() { 
 removeBlocks(); 
 var numberOfAuthors = document.getElementById('number-of-authors').value; 
 switch (numberOfAuthors) { 
     case '1': authorList.appendChild(addBlock()); 
               
       break; 
     case '2': authorList.appendChild(addBlock()); 
               authorList.appendChild(addBlock()); 
               
       break; 
     case '7': for (let i = 0; i < 7; i++) { 
               authorList.appendChild(addBlock()); 
             } 
       break; 
     case 'more-then-8': for (let i = 0; i < 6; i++) { 
                           authorList.appendChild(addBlock('<lable for="main-name">Фамилия ПОСЛЕДНЕГО автора</lable> <input name="main-name"/><lable>  Инициалы</lable>  </br></br>')); 
                         }                       
                         break; 
     case 'organisation': authorList.appendChild(addBlock('<lable for="main-name">Название организации, учреждения, что подготовила монографию <input name="main-name"/> </br></br>')); 
       break; 
   } 
}
<div id="modal-window"> 
<div class="form-wrapper"> 
  <form action=""> 
    <div id="authorList"><label>Количество авторов</label> 
    <select id="number-of-authors" name="number-of-authors" onchange="runSelect()"> 
      <option value="0" selected> Выбрать.. </option> 
      <option value="1" > 1 автор </option> 
      <option value="2"> 2 автора </option> 
      <option value="7"> от 3 до 7 авторов </option> 
      <option value="more-then-8"> больше 8 авторов </option> 
      <option value="organisation"> Автор неизвестен или коллективный автор (учреждение) </option> 
    </select></br></br> 
    </div> 
</form>

P.S. Не используйте одинаковый id у нескольких элементов, для объединения однотипных элементов в одну группу используйте атрибут class.

READ ALSO
Получить кириллический домен

Получить кириллический домен

Есть сайт (пример) - http://з-саюоыжаѓхнцчрф, но если перейти на него и получить url с помощью window

175
Объект проходит через коллизию при большой скорости

Объект проходит через коллизию при большой скорости

Делаю игру с видом сверхуДелаю так чтобы мышка не выходила за камеру

177
Как получить координаты курсора секунду назад?

Как получить координаты курсора секунду назад?

Это нужно для того, чтобы при смещении курсора влево запускалась одна анимация, при смещении курсора вправо - другая, если координаты остались...

158
Node.js socket.io emit не работает с кириллицей

Node.js socket.io emit не работает с кириллицей

имеется два варианта кода на сервере:

201