Как очистить innerHTML от пролетов

1

У меня есть базовая форма в 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.

CODEPEN

Теги:

1 ответ

1
Лучший ответ

Чтобы этого избежать, вы можете создать и добавить этот 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*/;
}
  • 0
    Спасибо за ответ @Microloft, это единственный способ предотвратить это? Я новичок в разработке, поэтому, пожалуйста, поправьте меня, если я ошибаюсь. Я бы предпочел оставить код создания внутри функции отправки, потому что таким образом диапазоны создаются только тогда, когда пользователь отправляет форму (до этого нет необходимости иметь эти диапазоны), таким образом, начальная загрузка страницы будет немного .... Быстрее? Я имею в виду, только немного. Это мое объяснение, почему я бы предпочел создавать эти промежутки только тогда, когда они полезны (чтобы показать сообщение об ошибке, когда пользователь отправляет форму).
  • 0
    Я понимаю, что вы имеете в виду, но мне все еще не ясно, чего вы пытаетесь достичь. Если нажать кнопку «Отправить» несколько раз, вы собираетесь удалить существующие span и создать новый набор, или просто перепрыгнуть через эту часть? Если пользователь наконец-то успешно отправит запрос, вы тоже собираетесь удалить эти существующие span ?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню