Когда я запускаю код ниже, я всегда получаю пустой FormData, из-за слишком сложной формы? Как мне изменить код?
Кажется, если я использую только теги, такие как form, input, label для создания формы, объект FormData не будет пустым. Может быть, я могу вручную построить строку и отправить ее через XMLHttpRequest, но лучше?
Любая помощь будет оценена, спасибо за ваше время.
HTML:
<form enctype="multipart/form-data" id="inquiry" name="inquiry" method="post" role="form"><!--action="processData.php"-->
<div class="row">
<div class="form-group">
<div class="col-md-6">
<label for="name">Your name</label>
<input type="text" class="form-control" id="name" maxlength="100">
</div>
<div class="col-md-6">
<label for="email">Your email address</label>
<input type="text" class="form-control" id="email" maxlength="100">
</div>
</div>
</div>
<div class="row">
<div class="form-group">
<div class="col-md-12">
<label for="subject">Subject</label>
<input type="text" class="form-control" id="subject" maxlength="100">
</div>
</div>
</div>
<div class="row">
<div class="form-group">
<div class="col-md-12">
<label for="message">Your message</label>
<textarea class="form-control" id="message" maxlength="5000"></textarea>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<button id="post-message" type="submit">
<span>Send Message</span>
</button>
</div>
</div>
</form>
ЯШ:
'use strict';
var Contact = function() {
var sendData = function() {
var xmlhttp = new XMLHttpRequest() ;
var url = "/php/processData.php";
var inquiryForm = document.forms.namedItem("inquiry");
var FD = new FormData(inquiryForm);
xmlhttp.open("POST", url , true);
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
var returnData = xmlhttp.responseText ;
}
};
xmlhttp.send(FD);
for (var [key, value] of FD.entries()) {
console.log(key, value);
}
};
var windowLoadHandler = function() {
window.addEventListener("load",function(){
var inquiryForm = document.getElementById("inquiry");
inquiryForm.addEventListener("submit",function(event){
event.preventDefault();
sendData();
});
});
};
return {
init : function(){
windowLoadHandler();
}
};
}();
Вам нужно будет добавлять имена ко всем элементам формы, иначе они не будут отправлены с формой.
Здесь код с некоторыми изменениями, чтобы заставить его работать
'use strict';
var Contact = (function() {
var sendData = function(form) {
var xmlhttp = new XMLHttpRequest();
var url = "/php/processData.php";
var FD = new FormData(form);
xmlhttp.open("POST", url, true);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
var returnData = xmlhttp.responseText; // note, async, can't be used outside this function
}
}
xmlhttp.send(FD);
console.log()
for (var pair of FD.entries()) {
console.log(pair[0] + ', ' + pair[1]);
}
}
var windowLoadHandler = function() {
var inquiryForm = document.getElementById("inquiry");
inquiryForm.addEventListener("submit", function(event) {
event.preventDefault();
sendData(this);
});
}
return {
init: function() {
windowLoadHandler();
}
};
})();
$(document).ready(function() {
Contact.init();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form enctype="multipart/form-data" id="inquiry" name="inquiry" method="post" role="form">
<!--action="processData.php"-->
<div class="row">
<div class="form-group">
<div class="col-md-6">
<label for="fullname">Your name</label>
<input type="text" class="form-control" id="fullname" name="fullname" maxlength="100">
</div>
<div class="col-md-6">
<label for="email">Your email address</label>
<input type="text" class="form-control" id="email" maxlength="100" name="email">
</div>
</div>
</div>
<div class="row">
<div class="form-group">
<div class="col-md-12">
<label for="subject">Subject</label>
<input type="text" class="form-control" id="subject" maxlength="100" name="subject">
</div>
</div>
</div>
<div class="row">
<div class="form-group">
<div class="col-md-12">
<label for="message">Your message</label>
<textarea class="form-control" id="message" maxlength="5000" name="message"></textarea>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<button id="post-message" type="submit">
<span>Send Message</span>
</button>
</div>
</div>
</form>
Кстати, вы вызываете Contact.init()
вы, вероятно, хотели IIFE.
Обратите внимание, что name
всегда плохое имя для переменной и даже худшее имя/идентификатор для элемента, поскольку window.name
уже существует.
Посмотрите, как форма просто передается из обработчика события, в функцию.
sendData
находится внутри другой функцииnamedItem
не является кросс-браузерным, вы должны использовать именноthis
в обработчике отправки, чтобы вместо этого перехватить форму. И, как отмечено выше, функцияContact
никогда не выполняется, а функцияsendData
находится внутри нее.