"Обработка события отправки формы в JavaScript без HTML"

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Обработка события отправки формы и предотвращение её стандартной перезагрузки возможно с помощью метода addEventListener и функции event.preventDefault() внутри обработчика события. После этого вы можете провести валидацию данных или отправить их на сервер:

JS
Скопировать код
document.querySelector('form').addEventListener('submit', function(event) {
  event.preventDefault(); // Предотвращаем перезагрузку страницы.
  // Обрабатываем данные формы...
  console.log('Форма отправлена. Отмечаем это!');
});

Таким образом, используя querySelector(), мы находим форму, а с помощью event.preventDefault() получаем полный контроль над процессом её отправки.

Кинга Идем в IT: пошаговый план для смены профессии

Дальше – больше: обработка событий и валидация форм

Универсальная регистрация обработчиков событий

Для поддержки совместимости с разными браузерами, стоит проверить наличие метода addEventListener и в случае его отсутствия использовать attachEvent:

JS
Скопировать код
var form = document.querySelector('form');

function onSubmit(event) {
  event.preventDefault();
  // Дальнейшая обработка формы...
}

// Выбираем метод, который будем использовать.
if (form.addEventListener) {
  form.addEventListener('submit', onSubmit);
} else if (form.attachEvent) {
  form.attachEvent('onsubmit', onSubmit);
}

Валидация HTML5: ваш первый защитник

HTML5 предоставляет встроенную валидацию для форм, но в случае старых браузеров хорошим решением будет запасной вариант валидации на JavaScript:

JS
Скопировать код
if (form.checkValidity === undefined) {
  // Валидация на стороне JavaScript для старых браузеров.
  form.addEventListener('submit', function(event) {
    var isValid = /* вставьте сюда свою логику валидации */;
    if (!isValid) {
      event.preventDefault();
      alert('Форма заполнена некорректно. Поправите, пожалуйста.');
    }
  });
} else {
  // иначе доверяем валидации HTML5
  form.setAttribute('novalidate', true);
}

Управление несколькими формами и библиотеками

Для обработки отправки нескольких форм достаточно использовать метод forEach:

JS
Скопировать код
// Слушаем отправку каждой формы.
Array.from(document.querySelectorAll('form')).forEach(function(form) {
  form.addEventListener('submit', onSubmit);
});

Создание библиотеки для независимой валидации:

JS
Скопировать код
// FormValidator – ни одна ошибка не останется незаметной!
function FormValidator(selector, callback) {
  this.forms = document.querySelectorAll(selector);
  this.forms.forEach(function(form) {
    form.addEventListener('submit', function(event) {
      event.preventDefault();
      var isValid = callback(form);
      if (isValid) {
        form.submit();
      }
    });
  });
}

// Пример использования FormValidator.
new FormValidator('form', function(form) {
  // Реализация вашей валидации.
  return true; // или false в зависимости от результата.
});

Визуализация

Отправку формы можно сравнить с криком монстра (👹), а обработчик событий JavaScript – с смелым охотником (🏹):

Markdown
Скопировать код
При крике монстра (форма отправляется):

1. Сигнал (📢) подает тревогу.
2. Охотник (🏹) и его команда готовы вступить в бой.

В коде это будет выглядеть следующим образом:

JS
Скопировать код
form.addEventListener('submit', (event) => {
    event.preventDefault();  // Останавливаем крик монстра (👹)!
    // Охотник (🏹) готов к действию!
});

Описанным действиям соответствует следующая последовательность:

Markdown
Скопировать код
👹: Монстр (отправленная форма) готовится.
Пользователь запускает крик (отправка формы) -> 📢: Звучит сигнал тревоги.
🏹: Охотник (обработчик событий) управляет криком (отправкой формы).

Смелым охотникам (🏹) удалось справиться с монстровским криком (📢)!

Приспособленность к фреймворкам

Отправка формы в AngularJS

В AngularJS все действия по отправке формы следует контролировать через создание директивы:

JS
Скопировать код
app.directive('myForm', function() {
  return {
    require: 'form',
    link: function(scope, element, attrs, form) {
      element.on('submit', function(event) {
        scope.$apply(function() {
          if (form.$valid && scope.customIsValid) {
            // Все проверки пройдены, форма отправлена...
          } else {
            event.preventDefault();
          }
        });
      });
    }
  };
});

Работа с формами в React

В React для контроля действий используется свойство onSubmit:

JS
Скопировать код
class MyForm extends React.Component {
  
  handleSubmit(event) {
    event.preventDefault();
    if (this.isValid(this.state)) {
      // Данные формы проверены и готовы к обработке!
    }
  }
  
  render() {
    return (
      <form onSubmit={this.handleSubmit.bind(this)}>
        {/* Элементы формы */}
      </form>
    );
  }
}

Гибкость и ориентированность на пользователя

Не забывайте, что формы созданы для пользователей, поэтому важно создавать удобный и интуитивно понятный интерфейс, отображать обратную связь при валидации и объяснять ошибки рядом с соответствующими полями. Работайте над библиотекой валидации, которая будет легко интегрироваться с различными шаблонами и фреймворками.

Полезные материалы

  1. HTMLFormElement: submit event – Web APIs | MDN — детальное руководство по обработке событий отправки формы на чистом JavaScript.
  2. JavaScript DOM EventListener — информация о использовании DOM EventListeners в контексте отправки форм.
  3. Form properties and methods — подробное объяснение и примеры работы с элементами форм и их отправкой на JavaScript.
  4. Event: preventDefault() method – Web APIs | MDN — информация о предотвращении стандартного поведения при отправке формы.
  5. Just a moment... — полезный материал на Stack Overflow с практическими советами и решениями от сообщества относительно добавления обработчиков событий к нескольким формам.