Обработка нескольких форм на странице одним скриптом AJAX без jQuery
Скрипт отлично обрабатывает одну из форм на странице, пробовал разные варианты чтобы обработать две и более форм, не смог, подскажите решение. привожу оригинал скрипта
if (document.forms.form1 && window.FormData) {
var form = document.forms.form1;
var message = new Object();
message.loading = 'Отправляем...';
message.success = 'Мы свяжемся с вами в ближайшее время ?';
message.failure = 'Что-то пошло не так ?';
var statusMessage = document.createElement('div');
statusMessage.className = 'status';
// форму скроем после отправки
// var inputform = document.querySelector('.custom-form');
// var formbutton = document.querySelector('button[type="submit"]');
// Настройка AJAX запроса
var request = new XMLHttpRequest();
request.open('POST', 'assets/hello.php', true);
request.setRequestHeader('accept', 'application/json');
// Добавляем обработчик на событие `submit`
form.addEventListener('submit', function(event) {
event.preventDefault();
form.appendChild(statusMessage);
// Это простой способ подготавливить данные для отправки (все браузеры и IE > 9)
var formData = new FormData(form);
// Отправляем данные
request.send(formData);
// Функция для наблюдения изменения состояния request.readyState обновления statusMessage соответственно
request.onreadystatechange = function () {
// <4 = ожидаем ответ от сервера
if (request.readyState < 4)
statusMessage.innerHTML = message.loading;
// 4 = Ответ от сервера полностью загружен
else if (request.readyState === 4) {
// 200 - 299 = успешная отправка данных!
if (request.status == 200 && request.status < 300) {
statusMessage.innerHTML = message.success;
// скрываем форму и отправляем событие в метрику
inputform.style.display = 'none';
yaCounter53696953.reachGoal('formsubmit');
}
else
statusMessage.innerHTML = message.failure;
// formbutton.disabled = true;
//form.insertAdjacentHTML('beforeend', message.failure);
}
}
});
}
<form name="form1" action="" method="POST">
<input name="name" type="text">
<button type="submit">Форма 1</button>
</form>
<form name="form2" action="" method="POST">
<input name="name" type="text">
<button type="submit">Форма 2</button>
</form>
Ответы (4 шт):
Автор решения: Igor
→ Ссылка
document.querySelectorAll("form").forEach(item => {
item.addEventListener('submit', function(event) {
var form = this;
event.preventDefault();
...
Автор решения: Denis640Kb
→ Ссылка
Вам необходимо вынести сначала основные параметры отдельно, а для ворм ввести цикл.
У Вас в примере есть параметры inputform и yaCounter53696953, которые неизвестно откуда получены, а в остальном так:
var form = document.getElementsByTagName('form');
var message = new Object();
message.loading = 'Отправляем...';
message.success = 'Мы свяжемся с вами в ближайшее время ?';
message.failure = 'Что-то пошло не так ?';
var statusMessage = document.createElement('div');
statusMessage.className = 'status';
for (let i=0;i<form.length;i++){
form[i].addEventListener('submit', function(event) {
event.preventDefault();
form[i].appendChild(statusMessage);
// Это простой способ подготавливить данные для отправки (все браузеры и IE > 9)
var formData = new FormData(form[i]);
// Настройка AJAX запроса
var request = new XMLHttpRequest();
request.open('POST', 'assets/hello.php', true);
request.setRequestHeader('accept', 'application/json');
// Отправляем данные
request.send(formData);
// Функция для наблюдения изменения состояния request.readyState обновления statusMessage соответственно
request.onreadystatechange = function () {
if (request.readyState < 4)
statusMessage.innerHTML = message.loading;
else if (request.readyState === 4) {
if (request.status == 200 && request.status < 300) {
statusMessage.innerHTML = message.success;
inputform.style.display = 'none';
yaCounter53696953.reachGoal('formsubmit');
}
else
statusMessage.innerHTML = message.failure;
}
}
});
}
<form name="form1" action="" method="POST">
<input name="name" type="text">
<button type="submit">Форма 1</button>
</form>
<form name="form2" action="" method="POST">
<input name="name" type="text">
<button type="submit">Форма 2</button>
</form>
Автор решения: weinbrg
→ Ссылка
Вот еще одно решение от моего друга :)
// обработчик всех форм
function formSubmitHandler(event) {
event.preventDefault();
var form = event.target;
var message = new Object();
message.loading = 'Отправляем...';
message.success = 'Мы свяжемся с вами в ближайшее время ?';
message.failure = 'Что-то пошло не так ?';
var statusMessage = document.createElement('div');
statusMessage.className = 'status';
// форму скроем после отправки
// var inputform = document.querySelector('.custom-form');
// var formbutton = document.querySelector('button[type="submit"]');
// Настройка AJAX запроса
var request = new XMLHttpRequest();
request.open('POST', 'assets/hello.php', true);
request.setRequestHeader('accept', 'application/json');
// Добавляем обработчик на событие `submit`
// form.addEventListener('submit', function(event) {
event.preventDefault();
form.appendChild(statusMessage);
// Это простой способ подготавливить данные для отправки (все браузеры и IE > 9)
var formData = new FormData(form);
// Отправляем данные
request.send(formData);
// Функция для наблюдения изменения состояния request.readyState обновления statusMessageс
request.onreadystatechange = function () {
// <4 = ожидаем ответ от сервера
if (request.readyState < 4)
statusMessage.innerHTML = message.loading;
// 4 = Ответ от сервера полностью загружен
else if (request.readyState === 4) {
// 200 - 299 = успешная отправка данных!
if (request.status == 200 && request.status < 300) {
statusMessage.innerHTML = message.success;
// скрываем форму и отправляем событие в метрику
inputform.style.display = 'none';
yaCounter53696953.reachGoal('formsubmit');
}
else
statusMessage.innerHTML = message.failure;
// formbutton.disabled = true;
//form.insertAdjacentHTML('beforeend', message.failure);
}
}
}
// Получаем список форм ...
var forms = document.querySelectorAll('form.has-agreement');
for (var i = 0; i < forms.length; i++) {
console.log(forms[i]);
var form = forms[i];
form.addEventListener('submit', formSubmitHandler);
}
<form name="form1" class="has-agreement" action="" method="POST">
<label for="agree1"><input id="agree1" class="agree" type="checkbox">Принять соглашение 1</label>
<button type="submit">Записаться на курс 1</button>
</form>
<form name="form2" class="has-agreement" action="" method="POST">
<label for="agree2"><input id="agree2" class="agree" type="checkbox">Принять соглашение 2</label>
<button type="submit">Записаться на курс 2</button>
</form>
Автор решения: kubris.pro
→ Ссылка
Рабочий каркас для нескольких форм с fetch.
Слегка не в тему сообщения, но навешать на него можно что угодно, при желании.
const forms = document.querySelectorAll('.form');
forms.forEach((form) => {
form.addEventListener('submit', sendFormData);
});
async function sendFormData(event) {
event.preventDefault();
const form = event.target;
const myFormData = new FormData(form);
if (myFormData.has('userAccept', 'on')) {
myFormData.set('subject', window.location.href);
myFormData.set('title', 'Задайте свой вопрос');
myFormData.delete('userAccept');
} else {
return console.log('error');
}
await fetch('http://website.ru/sender.php', {
method: 'POST',
body: myFormData
});
event.target.reset();
}
<form class="form">
<input type="text" name="userName" placeholder="Имя">
<input type="tel" name="userPhone" placeholder="Телефон">
<textarea name="userMessage" placeholder="Сообщение"></textarea>
<label class="form-ask__accept">
<input type="checkbox" name="userAccept" required> Ознакомлен и согласен
</label>
<button class="btn" type="submit">Отправить</button>
</form>
<br>
<form class="form">
<input type="text" name="userName" placeholder="Имя">
<input type="tel" name="userPhone" placeholder="Телефон">
<textarea name="userMessage" placeholder="Сообщение"></textarea>
<label class="form-ask__accept">
<input type="checkbox" name="userAccept" required> Ознакомлен и согласен
</label>
<button class="btn" type="submit">Отправить</button>
</form>
<!-- php-обработчик http://website.ru/sender.php -->
<!--
<? php
$c = true;
$name = trim(htmlentities($_POST['userName']));
$tel = trim(htmlentities($_POST['userPhone']));
$text = trim(htmlentities($_POST['userMessage']));
$subject = trim(htmlentities($_POST['subject']));
$to = "[email protected]";
$date = date("d.m.Y");
$time = date("h:i");
$toSelf = $to;
function adopt($txt) {
return '=?UTF-8?B?'.base64_encode($txt).'?=';
}
$headers = "MIME-Version: 1.0" . PHP_EOL .
"Content-Type: text/html; charset=utf-8" . PHP_EOL .
'From: '.adopt($subject).'<'.$toSelf .'>' . PHP_EOL;
foreach ($_POST as $key =>
$value ) {
$msg .= ""
. ( ($c = !$c) ? ' <tr>':'<tr style="background-color: #f8f8f8;">' )
. "<td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td>
<td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td>
</tr>";
}
$msg = "<table style='width: 100%;'>"
. " $msg"
."</table>";
mail($to, $subject, $msg, $headers);
?> -->