У меня есть базовая форма в html, когда пользователь оставляет пустые поля. Я показываю сообщение в промежутках, которые я создал с помощью javascript, насколько это хорошо. Но если я снова и снова нажимаю кнопку "отправить", сообщения печатаются снова и снова. Над сообщением, которое уже было напечатано, я имею в виду перекрытие.
Я попробовал element.innerHTML = ''; и это. Может быть, я плохо его реализую, так как это не работает.
var myForm = document.getElementsByTagName('form')[0];
var formFields = document.getElementsByTagName('label');
myForm.addEventListener('submit', function(){
event.preventDefault();
var statusMessageHTML = [];
// create empty spans
for(i = 0; i < formFields.length; i++){
statusMessageHTML[i] = document.createElement('span');
statusMessageHTML[i].className = 'status-field-message';
formFields[i].appendChild(statusMessageHTML[i]);
}
// print a string in empty spans
for(i = 0; i < formFields.length; i++){
statusMessageHTML[i].innerHTML = "Error Message"
}
return false;
});
PD: Я хочу решить это, используя чистый javascript.
Чтобы этого избежать, вы можете создать и добавить этот span
заранее и просто изменить их текст при нажатии кнопки отправки.
Например, измените код следующим образом:
var myForm = document.getElementsByTagName('form')[0];
var formFields = document.getElementsByTagName('label');
// create empty spans in advance
var statusMessageHTML = [];
for(var i = 0; i < formFields.length; i++) {
statusMessageHTML[i] = document.createElement('span');
statusMessageHTML[i].className = 'status-field-message';
formFields[i].appendChild(statusMessageHTML[i]);
}
myForm.addEventListener('submit', function(event) {
event.preventDefault();
// change the text of spans
for(var i = 0; i < formFields.length; i++)
statusMessageHTML[i].textContent = 'Error Message';
});
Замечания:
event
) в параметры функции.span.textContent
может быть предпочтительнее span.innerHTML
в вашем случае.addEventListener
смысла возвращать значение в addEventListener
обратного вызова addEventListener
. Возвращаемое значение просто отбрасывается.i
) перед их использованием.span
непосредственно в HTML, так как они являются "статичными" в структуре.Если я правильно понимаю, вы предпочитаете:
span
как заполнители, когда он впервые отправляется пользователю.span
когда получен ответ на запрос ajax.span
s, и следующий процесс останется тем же. Тогда я считаю, что вам просто нужно обернуть всю часть блока if-else
:
var myForm = document.getElementsByTagName('form')[0];
var formFields = document.getElementsByTagName('label');
var statusMessageHTML = [];
var isFirstSubmit = true;
myForm.addEventListener('submit', function(event) {
event.preventDefault();
if(isFirstSubmit) {
// create empty spans
for(var i = 0; i < formFields.length; i++) {
statusMessageHTML[i] = document.createElement('span');
statusMessageHTML[i].className = 'status-field-message';
formFields[i].appendChild(statusMessageHTML[i]);
}
isFirstSubmit = false;
} else {
// clear previous values
for(var i = 0; i < formFields.length; i++)
statusMessageHTML[i].textContent = '';
}
});
И перепишите значения, когда вы получите ответ (возможно, завернутый в функцию обратного вызова, поскольку это запрос AJAX):
function callback(response) {
for(var i = 0; i < formFields.length; i++)
statusMessageHTML[i].textContent = /*values in response*/;
}
span
и создать новый набор, или просто перепрыгнуть через эту часть? Если пользователь наконец-то успешно отправит запрос, вы тоже собираетесь удалить эти существующиеspan
?