#javascript #html
#javascript #HTML
Вопрос:
Это ввод HTML-кода:
<button id="addMore" class="button"> </button>
<div id="fieldList">
<input type="text" name="gsm[]" placeholder="GSM" required>
</div>
JavaScript:
$(function() {
$("#addMore").click(function(e) {
e.preventDefault();
$("#fieldList").append("<input type='text' name='gsm[]' placeholder='GSM' required>");
});
});
Поэтому, когда я нажимаю
кнопку, новое поле будет добавлено под первым, и значения должны быть массивом.
У меня есть еще одна кнопка, которая запускает этот скрипт:
$(function() {
$("#sendSamtykke").click(function(e) {
e.preventDefault();
var gsm = document.getElementById("gsm");
var gsm2 = "";
for (i = 0; i < gsm.length; i ) {
gsm2 = gsm[i] "<br>";
}
alert(gsm2);
});
});
В предупреждении должно быть напечатано первое входное значение и вторая строка со вторым входным значением, поскольку добавлены два поля, но предупреждение не отображается. Что я делаю не так? Я хочу, чтобы текст в обоих полях ввода отображался, как я могу сделать это правильно?
Комментарии:
1. У ваших элементов нет идентификаторов, поэтому не используйте
getElementById
их. В любом случае, как следует из названия, это возвращает один элемент, а не несколько элементов. Вместо этого используйтеgetElementsByName
orquerySelectorAll
, которые возвращают несколько элементов.
Ответ №1:
Вы используете getElementByID
, но ни у одного элемента нет этого идентификатора, и в любом случае это было бы плохой идеей, поскольку вы не можете повторно использовать идентификаторы.
попробуйте сделать это вместо этого, так как вы используете Jquery:
$(function() {
$("#sendSamtykke").click(function(e) {
e.preventDefault();
var gsm2 = "";
$("#fieldList input").each(function() {
gsm2 = $(this).val() "n";
});
alert(gsm2);
});
$("#addMore").click(function(e) {
e.preventDefault();
$("#fieldList").append("<input type='text' name='gsm[]' placeholder='GSM' required>");
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="addMore" class="button"> </button>
<div id="fieldList">
<input type="text" name="gsm[]" placeholder="GSM" required>
</div>
<button id="sendSamtykke" class="button">get</button>
Комментарии:
1. пока true, getElementById ничего не захватывает. это все равно не сработает, потому что селекторы имен не уникальны и
<br>
не сработают при оповещении. вам нужно использоватьn
для перевода строк в предупреждении.2. @Эдвард, я изменил символ новой строки. Однако использование name=’gsm[]` работает просто отлично, и добавление добавочного значения не добавляет ничего лишнего.
Ответ №2:
Прежде всего, я бы посоветовал взглянуть на вашу консоль (cmd option J, если вы используете Chrome на Mac). Бьюсь об заклад, в консоли есть какие-то ошибки.
Далее, каждому входному элементу необходимо присвоить уникальное имя. Каждый раз, когда вы нажимаете на кнопку, создается поле с тем же именем, так что циклу нечего захватывать.
Я создал для вас JSHINT, который, я надеюсь, решит ваши проблемы.
Вот код:
HTML
<button id="addMore" class="button"> </button>
<div id="fieldList">
<input type="text" name="gsm[0]" placeholder="GSM" required>
</div>
<button id="sendSamtykke">
send
</button>
JS
//set field to 0
var gsm = 0;
$("#addMore").click(function(e) {
e.preventDefault();
//increment on each
gsm ;
$("#fieldList").append("<input type='text' name='gsm[" gsm "]' placeholder='GSM' required>");
});
//for when you submit
$("#sendSamtykke").click(function(e) {
e.preventDefault();
//empty var
var gsm2 = "";
//loop through each input
//i is the index of each object in the array
//obj is each object in the array
$('input[name^="gsm"]').each(function(i,obj) {
var eachGsm = $(this).val();
console.log(eachGsm);
gsm2 = eachGsm "n";
});
alert(gsm2);
});
Комментарии:
1. Вы заметите, что я добавил значение к вашему первоначальному вводу gsm:
gsm[0]
это даст нам основу для увеличения количества полей ввода.