To prevent this, you can create and append those span
s in advance, and just modify their text when the submit button is clicked.
For example, rearrange your code as following:
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';
});
Note:
- You have to include corresponding variable name (i.e.,
event
) in the function's parameters before using it.
span.textContent
may be preferable to span.innerHTML
in your case.
- It is pointless to return a value in the
addEventListener
's callback function. The returned value is simply discarded.
- It is a good practice to declare all variables (e.g.,
i
) before using them.
- You can also construct those
span
s directly in HTML, since they are kind of "static" in the structure.
Updated
If I understand it correctly, you prefer:
- Create those
span
s as placeholders when it is the first time the user submits.
- Rewrite values in
span
s when the response of the ajax request is received.
- If the submit button is clicked multiple times, just clear previous values in
span
s, and the following process remains the same.
Then I believe you just need to wrap the whole part in a if-else
block:
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 = '';
}
});
And rewrite the values when you get the response (possibly wrapped in a callback function, since it is an AJAX request):
function callback(response) {
for(var i = 0; i < formFields.length; i++)
statusMessageHTML[i].textContent = /*values in response*/;
}