TransWikia.com

Repetir campos de acordo com o numero do dropdown

Stack Overflow em Português Asked by Fabio Henrique on December 16, 2021

Como Não sei muito de javascript gostaria de uma ajuda de como fazer que ao escolher um numero no dropdown, repeti-se os campos pelo valo escolhido

<select id="valores5" class="valores1 form-control" name="npax">

<option value="0">1</option>
<option value="1">2</option>
<option value="2">3</option>
<option value="3">4</option>
<option value="4">5</option>
<option value="5">6</option>
<option value="6">7</option>
<option value="7">8</option>
<option value="8">9</option>
 </select> 

//loop   x quantidade do select
<div>
<input class="form-control" value="" type="text" name="nome">
<input class="form-control" value="" type="text" name="cpf">
<input class="form-control" value="" type="text" name="tel"> 
<div>
//fim loop

3 Answers

Javascript puro

onchange - o evento ocorre quando o valor de um elemento for alterado

function criarInputs() {

//recupera o valor do option selecionado (n)
let select = document.getElementById('valores5');
let n = select.options[select.selectedIndex].value;
let campos=""

  for (i = 0; i < n; i++) {
    
   //só pra ver no console.log
   console.log('<input class="form-control" value="" type="text" name="nome"><input class="form-control" value="" type="text" name="cpf"><input class="form-control" value="" type="text" name="tel">');

  } 

}
<select id="valores5" class="valores1 form-control" name="npax" onchange="criarInputs()">

    <option value="0">1</option>
    <option value="1">2</option>
    <option value="2">3</option>
    <option value="3">4</option>
    <option value="4">5</option>
    <option value="5">6</option>
    <option value="6">7</option>
    <option value="7">8</option>
    <option value="8">9</option>

</select>



Observe que nos inputs o atributo “name” tem o mesmo valor para cada conjunto novo adicionado.

Para simplificar imagine o seguinte formulário:

    <form id='form' action="teste.php" method="POST">
        <input type="text" name="nome" value='nome1'>
        <input type="text" name="nome" value='nome2'>
        <button type="submit"> Enviar </button>
    </form>

Após fazer a requisição, no teste.php eu exibo as informações que vieram do form e o retorno é esse:

Array ( [nome] => nome2 ) 1

Veja que apesar de eu ter dois input’s no formulário, só foi me enviado um. Isso acontece porque quando um form é submetido e este tem vários input’s com o valor do atributo “name” iguais, só o último é considerado.

Para resolver isso

Para que todos input’s com o mesmo valor do atributo “name” sejam entregues após requisição, basta adicionar colchetes ao lado do valor do atributo “name”. Exemplo:

    <input type="text" name="nome[]" value='nome1'>
    <input type="text" name="nome[]" value='nome2'>


Seu código teria que ser

    function criarInputs() {

      //recupera o valor do option selecionado (n)
    let select = document.getElementById('valores5');
    let n = select.options[select.selectedIndex].value;
    let campos="";

      for (i = 0; i < n; i++) {
           if (n>1){
            console.log('<input class="form-control" value="" type="text" name="nome[]"><input class="form-control" value="" type="text" name="cpf[]"><input class="form-control" value="" type="text" name="tel[]">');
          }else{
            console.log('<input class="form-control" value="" type="text" name="nome"><input class="form-control" value="" type="text" name="cpf"><input class="form-control" value="" type="text" name="tel">');
          }
            
      } 
      document.getElementById("demo").innerHTML = campos;

    }
    <select id="valores5" class="valores1 form-control" name="npax" onchange="criarInputs()">

        <option value="0">1</option>
        <option value="1">2</option>
        <option value="2">3</option>
        <option value="3">4</option>
        <option value="4">5</option>
        <option value="5">6</option>
        <option value="6">7</option>
        <option value="7">8</option>
        <option value="8">9</option>
     </select>
     
     <div id="demo"></div>

Para não haver a duvida quanto ao comentário "Quase isso.... só que se eu escolher o numero 4 e depois trocar um menor tipo o 2 ele esta somando 4 mais 2 ao invés de remover"

Vamos executar sem console.log

    function criarInputs() {

      //recupera o valor do option selecionado (n)
    let select = document.getElementById('valores5');
    let n = select.options[select.selectedIndex].value;
    let campos="";

      for (i = 0; i < n; i++) {

          if (n>1){
             campos +='<input class="form-control" value="" type="text" name="nome[]"><input class="form-control" value="" type="text" name="cpf[]"><input class="form-control" value="" type="text" name="tel[]"><br><br>';
          }else{
             campos +='<input class="form-control" value="" type="text" name="nome"><input class="form-control" value="" type="text" name="cpf"><input class="form-control" value="" type="text" name="tel"><br><br>';
          }   
        
      } 
      document.getElementById("demo").innerHTML = campos;

    }
    <select id="valores5" class="valores1 form-control" name="npax" onchange="criarInputs()">

        <option value="0">1</option>
        <option value="1">2</option>
        <option value="2">3</option>
        <option value="3">4</option>
        <option value="4">5</option>
        <option value="5">6</option>
        <option value="6">7</option>
        <option value="7">8</option>
        <option value="8">9</option>
     </select>
     
     <div id="demo"></div>

Answered by user60252 on December 16, 2021

Você pode usar o Jquery e criar de acordo com os ids e classes.

Segue um exemplo para você poder fazer uns testes conforme suas necessidades.

$('#valores5').change(function() {
  let valores5 = $('#valores5').val()
  
  $('.div-campo-controle').remove();
  
  for (var i = 0; i < valores5; i++) {
    let novosCampos = $("#campo-modelo").clone()
    novosCampos.attr('id', 'campo='.concat(i + 1));
    novosCampos.addClass('div-campo-controle')
    novosCampos.insertAfter("div.div-campo:last");
    }
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="valores5" class="valores1 form-control" name="npax">

<option value="0">1</option>
<option value="1">2</option>
<option value="2">3</option>
<option value="3">4</option>
<option value="4">5</option>
<option value="5">6</option>
<option value="6">7</option>
<option value="7">8</option>
<option value="8">9</option>
 </select> 

<div id="campos">
<div id="campo-modelo" class="div-campo" >
<input class="form-control" value="" type="text" name="nome">
<input class="form-control" value="" type="text" name="cpf">
<input class="form-control" value="" type="text" name="tel"> 
<div>
<div>

Answered by Rodrigo Vinicius on December 16, 2021

Bom, tu pode gerar esse html por meio do JS, da pra fazer assim:

Arrumei teus values no select, não tem pq começar do 0 se você vai iterar pra gerar os inputs

<select id="valores5" class="valores1 form-control" onchange='createFields()' name="npax">

<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
 </select> 
 
 <div id='exemplo'>
 
 </div>

Fazer uma div pra ser o "wrapper" dos teus inputs e gerar eles dinâmicamente. Aqui vai o script pra tu usar, daria pra economizar umas linhas nesse código mas deixei assim pra ficar um pouco mais fácil de entender

let parent = document.getElementById('exemplo')

function createDiv () {
  let div_html = document.createElement('div'); // criar uma div pra botar os 3 campos
  //criar os campos com os atributos que você quer
  let input1 = document.createElement('input');
  input1.type = 'text';
  input1.name = 'nome';
  input1.class = 'form-control';
  let input2 = document.createElement('input');
  input2.type = 'text';
  input2.name = 'cpf';
  input2.class = 'form-control';
  let input3 = document.createElement('input');
  input3.type = 'text';
  input3.name = 'tel';
  input3.class = 'form-control';
  // montar a div com os 3 fields
  div_html.appendChild(input1)
  div_html.appendChild(input2)
  div_html.appendChild(input3)
  
  return div_html
}

function createFields() {
  // remover os campos que já estão dentro do parent, pra não ficar adicionando campos um atrás do outro
  while(parent.firstChild) {
    parent.removeChild(parent.firstChild);
}
  let num = document.getElementById('valores5').value // pegar valor do select
  for (let x = 0; x < Number(num); x++) {
   parent.appendChild(createDiv()) // adicionar a div com os fields, iterando o valor do select
  }
 
}

Answered by placementw on December 16, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP