Aggiunta dinamica di elementi di input al modulo


92

Ho letto molti blog e post sull'aggiunta dinamica di set di campi, ma tutti danno una risposta molto complicata. Quello di cui ho bisogno non è così complicato.

Il mio codice HTML:

<input type="text" name="member" value="">Number of members: (max. 10)<br />
<a href="#" id="filldetails">Fill Details</a>

Quindi, un utente inserirà un valore intero (sto controllando la convalida utilizzando javascript) nel inputcampo. E facendo clic sul Fill Detailscollegamento, apparirà il numero corrispondente di campi di input da inserire. Voglio ottenere questo risultato utilizzando javascript.

Non sono un professionista in javascript. Stavo pensando come posso recuperare il numero intero compilato dall'utente nel inputcampo tramite il link e visualizzando il numero corrispondente di campi di input.

Risposte:


153

È possibile utilizzare un onclickgestore di eventi per ottenere il valore di input per il campo di testo. Assicurati di assegnare al campo un idattributo univoco in modo da poterlo fare riferimento in sicurezza tramite document.getElementById():

Se vuoi aggiungere dinamicamente elementi, dovresti avere un contenitore in cui posizionarli. Ad esempio, a <div id="container">. Creare nuovi elementi mediante document.createElement()e utilizzare appendChild()per aggiungere ciascuno di essi al contenitore. Potresti essere interessato all'output di un nameattributo significativo (ad esempio name="member"+iper ciascuno degli <input>s generati dinamicamente se devono essere presentati in un modulo.

Nota che potresti anche creare <br/>elementi con document.createElement('br'). Se vuoi solo produrre del testo, puoi usare document.createTextNode()invece.

Inoltre, se vuoi svuotare il contenitore ogni volta che sta per essere popolato, puoi usare hasChildNodes()e removeChild()insieme.

<html>
<head>
    <script type='text/javascript'>
        function addFields(){
            // Number of inputs to create
            var number = document.getElementById("member").value;
            // Container <div> where dynamic content will be placed
            var container = document.getElementById("container");
            // Clear previous contents of the container
            while (container.hasChildNodes()) {
                container.removeChild(container.lastChild);
            }
            for (i=0;i<number;i++){
                // Append a node with a random text
                container.appendChild(document.createTextNode("Member " + (i+1)));
                // Create an <input> element, set its type and name attributes
                var input = document.createElement("input");
                input.type = "text";
                input.name = "member" + i;
                container.appendChild(input);
                // Append a line break 
                container.appendChild(document.createElement("br"));
            }
        }
    </script>
</head>
<body>
    <input type="text" id="member" name="member" value="">Number of members: (max. 10)<br />
    <a href="#" id="filldetails" onclick="addFields()">Fill Details</a>
    <div id="container"/>
</body>
</html>

Guarda un esempio funzionante in questo JSFiddle .


Ho seguito il tuo consiglio. Ma quando clicco su, la console del browser mostra questo errore:Uncaught TypeError: Cannot call method 'appendChild' of undefined
xan

La risposta è molto utile. E come posso aggiungere una classe CSS al campo
Pravinraj Venkatachalam

3
@Pravin Sono contento che abbia aiutato, vedi Come aggiungo una classe a un dato elemento? . Fondamentalmente usainput.className += ' someCSSClass';
Xavi López

1
Quando invio il modulo, i nuovi campi generati dinamicamente non vengono inviati come gli altri campi che facevano parte dell'HTML originale. Si presentano visivamente e posso ispezionarli ma non si sottomettono. Qualche idea sul perché sarebbe successo?
circle1

@ circle1 Assicurati che gli elementi generati dinamicamente abbiano un nameattributo univoco . Solo gli elementi del modulo con un attributo name avranno i loro valori passati quando si invia un modulo.
Xavi López

33

Prova questo codice JQuery per includere dinamicamente il modulo, il campo e il comportamento di eliminazione / rimozione:

$(document).ready(function() {
    var max_fields = 10;
    var wrapper = $(".container1");
    var add_button = $(".add_form_field");

    var x = 1;
    $(add_button).click(function(e) {
        e.preventDefault();
        if (x < max_fields) {
            x++;
            $(wrapper).append('<div><input type="text" name="mytext[]"/><a href="#" class="delete">Delete</a></div>'); //add input box
        } else {
            alert('You Reached the limits')
        }
    });

    $(wrapper).on("click", ".delete", function(e) {
        e.preventDefault();
        $(this).parent('div').remove();
        x--;
    })
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container1">
    <button class="add_form_field">Add New Field &nbsp; 
      <span style="font-size:16px; font-weight:bold;">+ </span>
    </button>
    <div><input type="text" name="mytext[]"></div>
</div>

Fare riferimento alla demo qui


Forse sto facendo qualcosa di sbagliato, ma nel mio caso qualsiasi pressione di invio in un campo di testo in questo modulo porterà all'attivazione della funzione del pulsante "Aggiungi nuovo campo", che probabilmente è un comportamento indesiderato ...
Maxi Mus

1
<button type="button" ...>e il problema è risolto.
Maxi Mus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.