JavaScript - получение значений HTML-формы


112

Как я могу передать значение HTML-формы в JavaScript?

Это верно? Мой скрипт принимает два аргумента: один из текстового поля, один из раскрывающегося списка.

<body>
<form name="valform" action="" method="POST">

Credit Card Validation: <input type="text" id="cctextboxid" name="cctextbox"><br/>
Card Type: <select name="cardtype" id="cardtypeid">
  <option value="visa">Visa</option>
  <option value="mastercard">MasterCard</option>
  <option value="discover">Discover</option>
  <option value="amex">Amex</option>
  <option value="diners">Diners Club</option>
</select><br/>
<input type="button" name="submit" value="Verify Credit Card" onclick="isValidCreditCard(document.getElementById('cctextboxid').value,document.getElementById('cardtypeid').value)" />
</body>

2
Что именно вы подразумеваете под «значением формы в HTML-коде»?
Пекка

7
вопрос вполне ясен
laurentngu

1
@laurentngu вопрос является ли он имел в виду «значение в HTML - форме», что означает одно значение из из множества значений, или же он означает « значение всей формы HTML», то есть все значения в один большой «Сериализированная "value
bluejayke

Вопрос ясен ... но ясно, что передавать значение формы не имеет большого смысла.
Матфей

Ответы:


115

HTML:

<input type="text" name="name" id="uniqueID" value="value" />

JS:

var nameValue = document.getElementById("uniqueID").value;

7
@ shorty876: Ты сам это тестировал? o_0 Это был бы неплохой способ определить, правильно ли вы сделали.
Джефф Руперт,

1
Да, но он просто возвращает истину / ложь, и я не знаю, как определить, была ли функция вообще вызвана. Таким образом, вы можете помочь.
user377419

Я попробовал это, но nameValueэто значение по умолчанию, а не то, что ввел пользователь.
Джеймс Т.

почему name = "name" и что, если у него вообще нет идентификатора?
bluejayke

65

Если вы хотите получить значения формы (например, те, которые будут отправлены с помощью HTTP POST), вы можете использовать:

JavaScript

const formData = new FormData(document.querySelector('form'))
for (var pair of formData.entries()) {
  // console.log(pair[0] + ': ' + pair[1]);
}

форма-сериализация ( https://code.google.com/archive/p/form-serialize/ )

serialize(document.forms[0]);

jQuery

$("form").serializeArray()

12
Ваш первый пример FormDataсам по себе ничего не делает ... вам все равно нужно получить значения из формы.
Putvande

1
Я считаю, что это неверно. Если при инициализации FormData вы укажете элемент формы, он будет правильно извлекать значения. codepen.io/kevinfarrugia/pen/Wommgd
Кевин Фарруджа

2
Однако сам объект FormData не является значениями. Вам по-прежнему нужно вызывать и перебирать FormData.entries(), чтобы получить значения. Кроме того, FormData.entries()он недоступен в Safari, Explorer или Edge. developer.mozilla.org/en-US/docs/Web/API/FormData
Дэйв

1
Верно с точки зрения совместимости с браузером, однако есть полифилы . Что касается повторения formData.entries(), это зависит от того, что вы ищете. Если вы ищете значение одного поля, вы можете использовать formData.get(name). Ссылка: get () .
Кевин

Да, я не могу FormDataничего выводить в Chrome.
Atav32

33

Вот пример из W3Schools:

function myFunction() {
    var elements = document.getElementById("myForm").elements;
    var obj ={};
    for(var i = 0 ; i < elements.length ; i++){
        var item = elements.item(i);
        obj[item.name] = item.value;
    }

    document.getElementById("demo").innerHTML = JSON.stringify(obj);
}

Демо можно найти здесь .


12
Просто предупреждение: если кто-то хочет получить выбранные значения других типов входов, таких как переключатели или флажки, это не сделает то, что вы хотите.
Шон

Пришлось сменить var obj = {};на var obj = [];.
Дэниел Уильямс

@ Шон, почему бы не работать с переключателями? Они также появляются в свойстве elements
bluejayke

@bluejayke Код будет циклически перебирать все входы радиокнопки и сохранять «значение» ПОСЛЕДНЕЙ радиокнопки obj, независимо от того, какой из них выбран. Проблема демонстрируется здесь (выберите «Вариант 1») w3schools.com/code/tryit.asp?filename=GEZXJXBBI7AW
Шон

29

document.formsбудет содержать массив форм на вашей странице. Вы можете просмотреть эти формы, чтобы найти желаемую форму.

var form = false;
var length = document.forms.length;
for(var i = 0; i < length; i++) {
    if(form.id == "wanted_id") {
        form = document.forms[i];
    }
}

Каждая форма имеет массив элементов, который затем можно просмотреть в цикле, чтобы найти нужные данные. Вы также должны иметь доступ к ним по имени

var wanted_value = form.someFieldName.value;
jsFunction(wanted_value);

Почему более короткий метод не был упомянут первым? = -D
Клесун

2
@ArturKlesun Думаю, это потому, что десять лет назад я начал набирать ответ, OP не обновлялся, поэтому я написал цикл for для обработки большинства ситуаций. Думаю, тогда я также обеспечивал совместимость браузера с IE7, потому что у нас не было гораздо лучшего ландшафта, чем сегодня.
Codeacula

5

Мои 5 центов здесь, использование form.elementsкоторых позволяет вам запрашивать каждое поле по немуname , а не только по итерации:

const form = document.querySelector('form[name="valform"]');
const ccValidation = form.elements['cctextbox'].value;
const ccType = form.elements['cardtype'].value;

2

Расширяя идею Атрура Клесуна ... вы можете просто получить к нему доступ по его имени, если вы используете getElementById для доступа к форме. В одной строке:

document.getElementById('form_id').elements['select_name'].value;

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


2

Это разработанный пример https://stackoverflow.com/a/41262933/2464828

Рассматривать

<form method="POST" enctype="multipart/form-data" onsubmit="return check(event)">
    <input name="formula">
</form>

Предположим, мы хотим получить ввод имени formula. Это можно сделать, передав eventв onsubmitполе. Затем мы можем использовать FormDataдля получения значений этой точной формы, ссылаясь на SubmitEventобъект.

const check = (e) => {
    const form = new FormData(e.target);
    const formula = form.get("formula");
    console.log(formula);
    return false
};

Приведенный выше код JavaScript затем выведет значение ввода в консоль.

Если вы хотите перебрать значения, т. Е. Получить все значения, см. Https://developer.mozilla.org/en-US/docs/Web/API/FormData#Methods.


Большой!. Это именно то, что мне нужно. Спасибо.
Данг Конг Дыонг,


1

Пожалуйста, попробуйте изменить код, как показано ниже:

<form
   onSubmit={e => {
     e.preventDefault();
     e.stopPropagation();

     const elements = Array.from(e.currentTarget) as HTMLInputElement[];

     const state = elements.reduce((acc, el) => {
       if (el.name) {
         acc[el.name] = el.value;
       }

       return acc;
     }, {});

     console.log(state); // {test: '123'}
   }}
>
   <input name='test' value='123' />
</form>

Спасибо, ваш идеальный код работает для меня!
ЛИ ХО ТАН,

0

Быстрое решение для сериализации формы без каких-либо библиотек

function serializeIt(form) {
  return (
    Array.apply(0, form.elements).map(x => 
      (
        (obj => 
          (
            x.type == "radio" ||
            x.type == "checkbox"
          ) ?
            x.checked ? 
              obj
            : 
              null
          :
            obj
        )(
          {
            [x.name]:x.value
          }
        )
      )
    ).filter(x => x)
  );
}

function whenSubmitted(e) {
  e.preventDefault()
  console.log(
    JSON.stringify(
      serializeIt(document.forms[0]),
      4, 4, 4
    )
  )
}
<form onsubmit="whenSubmitted(event)">
<input type=text name=hiThere value=nothing>
<input type=radio name=okRadioHere value=nothin>
<input type=radio name=okRadioHere1 value=nothinElse>
<input type=radio name=okRadioHere2 value=nothinStill>

<input type=checkbox name=justAcheckBox value=checkin>
<input type=checkbox name=justAcheckBox1 value=checkin1>
<input type=checkbox name=justAcheckBox2 value=checkin2>

<select name=selectingSomething>
<option value="hiThere">Hi</option>
<option value="hiThere1">Hi1</option>
<option value="hiThere2">Hi2</option>
<option value="hiThere3">Hi3</option>
</select>
<input type=submit value="click me!" name=subd>
</form>


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.