FormData, созданный из существующей формы, кажется пустым, когда я регистрирую его
Я пытаюсь получить набор ключей (имена ввода или похожие) и значения (входные значения) из веб-формы:
<body>
<form>
<input type="text" name="banana" value="swag">
</form>
<script>
var form = document.querySelector('form');
var formData = new FormData(form);
</script>
</body>
Согласно документации FormData, formData
должен содержать ключи и значения из формы. Но console.log(formData)
показывает, что formData
пуст.
Как быстро получить данные из формы с помощью FormData?
JSFiddle
Ответы
Ответ 1
Обновление: спецификация XHR теперь включает еще несколько функций для проверки объектов FormData.
FireFox поддерживает новые функции начиная с версии 39.0, Chrome планируется получить поддержку в версии v50. Не уверен насчет других браузеров.
var form = document.querySelector('form');
var formData = new FormData(form);
for (var [key, value] of formData.entries()) {
console.log(key, value);
}
//or
console.log(...formData)
Ответ 2
Я также столкнулся с той же проблемой. Я не мог видеть на консоли. Вам необходимо добавить следующее в запрос ajax, чтобы данные были отправлены
processData: false, contentType: false
Ответ 3
Но console.log(formData)
показывает, что formData
пуст.
Что вы подразумеваете под "пустым"? Когда я проверяю это в Chrome, он показывает ‣ FormData {append: function}
... то есть объект FormData, чего мы и ожидали. Я сделал скрипку и расширил код до этого:
var form = document.querySelector('form'),
formData = new FormData(form),
req = new XMLHttpRequest();
req.open("POST", "/echo/html/")
req.send(formData);
... и вот что я увидел на панели Chrome Developer Tools Network:
![HTTP request]()
Так что код работает как положено.
Я думаю, что разобщение здесь в том, что вы ожидаете, что FormData будет работать как обычный JavaScript-объект или массив и позволит вам непосредственно просматривать и манипулировать его содержимым. К сожалению, это не работает так: у FormData есть только один метод в своем публичном API, который append
. Практически все, что вы можете с ним сделать - это создать его, добавить к нему значения и передать его в XMLHttpRequest.
Если вы хотите получить значения формы таким образом, чтобы вы могли проверять и манипулировать ими, вам придется делать это старомодным способом: перебирая элементы ввода и получая каждое значение одно за другим - или используя функция, написанная кем-то другим, например, jQuery. Вот SO поток с несколькими подходами к этому: Как я могу получить данные формы с помощью JavaScript/jQuery?
Ответ 4
Согласно документации MDN на FormData
Объект, реализующий FormData, может быть непосредственно использован в for... для структуры, а не для entries(): for (var p myFormData) эквивалентен for (var p myFormData.entries()).
Итерация по FormData.entries() не сработала для меня.
Вот что я делаю, чтобы проверить, пуст ли formData или нет:
var isFormDataEmpty= true;
for (var p of formData) {
isFormDataEmpty= false;
break;
}
Как итерация над formData дает вам загруженный файл, вы можете использовать его для получения имени файла, проверки типа файла и т.д.