Ошибка работы скрипта
Скрипт отправки формы на сервер через Ajax должен выводить три картинки в зависимости от ситуации: ожидание ответа сервера, успешная отправка, сбой. Однако и на локальном сервере и на хостинге при отправке формы он выдает все время только одну картинку, первую (ожидание ответа). При этом, если картинки заменить текстовыми сообщениями, то все работает нормально и после отправки формы появляется сообщение об успешной операции.
let message = new Object();
let form = document.getElementsByClassName('main-form')[0],
input = form.getElementsByTagName('input'),
statusMessage = document.createElement('div');
form.addEventListener('submit', function(event) {
event.preventDefault();
form.appendChild(statusMessage);
// AJAX
let request = new XMLHttpRequest();
request.open("POST", 'server.php')
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
let formData = new FormData(form);
request.send(formData);
request.onreadystatechange = function() {
if (request.readyState < 4) {
//Добавляем картинку при ожидании отправки формы
statusMessage.classList.add('form-awaiting');
} else if (request.readyState === 4) {
if (request.status == 200 && request.status < 300) {
//Добавляем картинку при удачной отправке формы
statusMessage.classList.add('form-success');
}
else {
//Добавляем картинку при неудачной отправке формы
statusMessage.classList.add('form-failure');
}
}
};
//Очистка инпутов
for (let i = 0; i < input.length; i++) {
input[i].value = '';
}
});
//Оправка данных с формы в разделе "Контакты"
let contactForm = document.getElementById('form'),
contactFormInput = contactForm.getElementsByTagName('input');
contactForm.addEventListener('submit', function(event) {
event.preventDefault();
contactForm.appendChild(statusMessage);
// AJAX
let request = new XMLHttpRequest();
request.open("POST", 'server.php')
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
let contactFormData = new FormData(contactForm);
request.send(contactForm);
request.onreadystatechange = function() {
if (request.readyState < 4) {
//Добавляем картинку при ожидании отправки формы
statusMessage.classList.add('form-awaiting__contact-form');
} else if (request.readyState === 4) {
if (request.status == 200 && request.status < 300) {
//Добавляем картинку при удачной отправке формы
statusMessage.classList.add('form-success__contact-form');
}
else {
//Добавляем картинку при неудачной отправке формы
statusMessage.classList.add('form-failure__contact-form');
}
}
};
//Очистка инпутов
for (let i = 0; i < contactFormInput.length; i++) {
contactFormInput[i].value = '';
}
});
|
DVV, поменяй в css порядок следования классов form-[x]__contact-form :)
Ну или добавь при readyState === 4:
statusMessage.classList.remove('form-awaiting__contact-form');
|
Не помогло:cray:
|
В режиме симуляции запроса все работает...
<style>
.form-awaiting {
background-image: url(http://javascript.ru/cat/list/project.jpg);
}
.form-success {
background-image: url(http://javascript.ru/cat/list/donkey.gif);
}
.form-failure {
background-image: url(http://javascript.ru/cat/list/js.gif);
}
</style>
<div class="main-form">
<input type="text">
</div>
<script>
let form = document.querySelector('.main-form'),
request = form.querySelector('input'),
statusMessage = document.createElement('div'),
i = 0;
statusMessage.style="width:50px;height:50px;";
form.appendChild(statusMessage);
request.onchange = function() {
var classList = statusMessage.classList;
while (classList.length > 0) {
classList.remove(classList.item(0));
}
if (request.value == "1") {
//Добавляем картинку при ожидании отправки формы
statusMessage.classList.add('form-awaiting');
} else if (request.value == "2") {
//Добавляем картинку при удачной отправке формы
statusMessage.classList.add('form-success');
}
else {
//Добавляем картинку при неудачной отправке формы
statusMessage.classList.add('form-failure');
}
};
function send(){
setTimeout(function(){
i = Math.round(Math.random() * 2) + 1;
request.value = i;
var event = new Event('change');
request.dispatchEvent(event);
send();
},2000)
}
send();
</script>
Непринципиальный момент, но у вас лишнее условие if (request.status == 200 Уж если равно 200, то что еще нужно? |
Dilettante_Pro, onreadystatechange вызывается несколько раз по мере обработки запроса.
DVV, что значит не помогло? Смотрим, сейчас у тебя примерно так:
<style>
#statusMessage{
width:100px;
height:100px;
}
.form-success:after {
content:"form-success"
}
.form-failure:after {
content:"form-failure"
}
.form-awaiting:after {
content:"form-awaiting"
}
</style>
<div id="statusMessage">result: </div>
<script>
let request = new XMLHttpRequest();
request.open("GET", location.href)
request.send(null);
request.onreadystatechange = function() {
if (request.readyState < 4) {
//Добавляем картинку при ожидании отправки формы
statusMessage.classList.add('form-awaiting');
} else if (request.readyState === 4) {
if (request.status == 200) {
statusMessage.classList.add('form-success');
}
else {
statusMessage.classList.add('form-failure');
}
}
};
</script>
Меняешь классы местами, и внезапно работает:
<style>
#statusMessage{
width:100px;
height:100px;
}
.form-awaiting:after {
content:"form-awaiting"
}
.form-success:after {
content:"form-success"
}
.form-failure:after {
content:"form-failure"
}
</style>
<div id="statusMessage">result: </div>
<script>
let request = new XMLHttpRequest();
request.open("GET", location.href)
request.send(null);
request.onreadystatechange = function() {
if (request.readyState < 4) {
//Добавляем картинку при ожидании отправки формы
statusMessage.classList.add('form-awaiting');
} else if (request.readyState === 4) {
if (request.status == 200) {
statusMessage.classList.add('form-success');
}
else {
statusMessage.classList.add('form-failure');
}
}
};
</script>
чудесно, неправда ли?Или второй предложенный вариант:
<style>
#statusMessage{
width:100px;
height:100px;
}
.form-success:after {
content:"form-success"
}
.form-failure:after {
content:"form-failure"
}
.form-awaiting:after {
content:"form-awaiting"
}
</style>
<div id="statusMessage">result: </div>
<script>
let request = new XMLHttpRequest();
request.open("GET", location.href)
request.send(null);
request.onreadystatechange = function() {
if (request.readyState < 4) {
//Добавляем картинку при ожидании отправки формы
statusMessage.classList.add('form-awaiting');
} else if (request.readyState === 4) {
statusMessage.classList.remove('form-awaiting');
if (request.status == 200) {
statusMessage.classList.add('form-success');
}
else {
statusMessage.classList.add('form-failure');
}
}
};
</script>
|
Цитата:
Переделал на бесконечный цикл со случайным параметром и добавил очистку classList. |
Супер! Теперь заработало. Я, правда, немного код под себя подправил, но теперь все как часы работает. Спасибо))
|
| Часовой пояс GMT +3, время: 11:36. |