Динамічне додавання елементів введення до форми


89

Я читав багато блогів та дописів про динамічне додавання наборів полів, але всі вони дають дуже складну відповідь. Те, що мені потрібно, не таке вже й складне.

Мій HTML-код:

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

Отже, користувач введе ціле значення (я перевіряю перевірку за допомогою javascript) у inputполе. І після натискання на Fill Detailsпосилання для нього з’явиться відповідна кількість полів введення. Я хочу досягти цього за допомогою JavaScript.

Я не професіонал у javascript. Я думав, як я можу отримати ціле число, заповнене користувачем у inputполі за посиланням, і відобразити відповідну кількість полів введення.

Відповіді:


149

Ви можете використовувати onclickобробник подій, щоб отримати вхідне значення для текстового поля. Обов’язково надайте поле унікальний idатрибут, щоб ви могли безпечно посилатися на нього через document.getElementById():

Якщо ви хочете динамічно додавати елементи, у вас повинен бути контейнер, куди їх розмістити. Наприклад, a <div id="container">. Створюйте нові елементи за допомогою document.createElement()і використовуйте appendChild()для додавання кожного з них до контейнера. Можливо, вам буде цікаво вивести значущий nameатрибут (наприклад, name="member"+iдля кожного з динамічно сформованих <input>s, якщо вони мають бути подані у формі.

Зверніть увагу, що ви також можете створювати <br/>елементи за допомогою document.createElement('br'). Якщо ви хочете просто вивести якийсь текст, ви можете використовувати його document.createTextNode().

Крім того , якщо ви хочете , щоб очистити контейнер кожен раз , коли мова йде про заселятися, можна використовувати hasChildNodes()і removeChild()разом.

<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>

Див. Робочий зразок у цьому JSFiddle .


Я послухався вашої поради. Але коли я натискаю на, на консолі браузера відображається така помилка:Uncaught TypeError: Cannot call method 'appendChild' of undefined
xan

Відповідь дуже корисна. І як я можу додати клас CSS до поля
Pravinraj Venkatachalam

3
@Pravin Радий, що це допомогло, див. Як додати клас до даного елемента? . В основному використанняinput.className += ' someCSSClass';
Хаві Лопес

1
Коли я подаю форму, нові поля, що генеруються динамічно, не надсилаються, як інші поля, які були частиною вихідного HTML. Вони з’являються візуально, і я можу їх оглянути, але вони не подаються. Будь-які ідеї, чому це могло б статися?
коло1

@ circle1 Переконайтесь, що динамічно генеровані елементи мають унікальний nameатрибут. Під час подання форми значення передаються лише елементам форми з атрибутом name.
Хаві Лопес,

30

Спробуйте цей код JQuery для динамічного включення форми, поля та видалення / видалення поведінки:

$(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>

Див. Демонстрацію тут


Можливо, я роблю щось не так, але в моєму випадку будь-яке натискання клавіші Enter у текстовому полі у цій формі призведе до запуску функції кнопки "Додати нове поле", що, ймовірно, є небажаною поведінкою ...
Maxi Mus

1
<button type="button" ...>і проблема вирішена.
Maxi Mus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.