jQuery: Плагин для асинхронной отправки форм

  • воскресенье, 16 октября 2016 г. в 15:39:18

Прошло не мало времени, с момента последней статьи. Я не мог написать ни статью, ни покодить и даже заняться своими проектами. Причиной всему явилось то, что мой макбук неожиданно решил, что он достаточно отработал и пора экрану отрубиться и больше не включаться. К счастью, у меня была гарантия до 2017 года и я смог отдать в сертифицированный сервисный центр Apple, который находился в Пятигорске. Вчера мой ноутбук уже починили и сейчас, я могу написать очередную статью связанную с jQuery плагином.

На этот раз, я хотел бы рассказать про очень полезный и весьма простой в использовании плагин jQuery.fajax от разработчика @aziev.

При разработке своих проектов, я стал замечать, что для отправки форм AJAX-ом я пишу практически один и тот же код, раз за разом. Наверное, было бы разумно вынести весь этот код в отдельный файл, на что, я кстати и хотел написать подобный плагин.

После того, как пошарил разные репозитории на Github'е, я наткнулся на плагин jQuery Form Plugin, который выполняет требуемую задачу, но в то же время имеет большой для меня минус. Он содержит в себе кучу ненужных функций и весит 43 kb.

Чем fajax полезен?

К примеру, если у вас многие запросы выполняются через AJAX и имеется форма, которая портит асинхронность сайта. С помощью данного плагина, элемент <form> можно превратить в "AJAX форму" и в дальнейшем, отправка данной формы будет выполняться через метод $.ajax(). Так же, данный плагин поддерживает отправку файлов.

В качестве примера, я решил показать вам как работает стандартная форма.

Нет возможности проверить ответ от сервера и в любом случае, моя страница должна обновиться. А это не сильно радует, если сайт в большей степени на AJAX запросах. Придется обрабатывать данный запрос на PHP и уже выводить каким-то образом информацию клиенту, после обновления страницы.

А в следующей демонстрации, я уже подключил данный плагин и как видим, страницы не обновляется и получаем ответ мгновенно. Это довольно приятно, не правда ли?

Если кому-то понравился дизайн формы, то я использовал очень крутой CSS фреймворк Semantic UI. Ничем не хуже того же Bootstrap.

Сам запрос, выглядит примерно так.

Говоря о самом плагине, то он не только упрощает работу с формой, но и разработку самого кода. Я покажу ниже разницу, чтобы вы сравнили стандартный метод и метод с плагином.

HTML


_72
<!DOCTYPE html>
_72
<html lang="en">
_72
<head>
_72
<meta charset="UTF-8">
_72
<title>jQuery.fajax Demo</title>
_72
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.4/semantic.min.css">
_72
<link rel="stylesheet" href="styles.css">
_72
</head>
_72
<body>
_72
_72
<div class="ui container">
_72
_72
<div class="ui form">
_72
<form action="https://httpbin.org/post" method="post">
_72
_72
<div class="field">
_72
<label>Fullname</label>
_72
<input type="text" name="fullname" placeholder="Amon Bower">
_72
</div>
_72
_72
<div class="field">
_72
<label>Phone</label>
_72
<input type="text" name="phone" placeholder="+7 (999) 123-456-789">
_72
</div>
_72
_72
<div class="field">
_72
<label>Text</label>
_72
<textarea name="text" placeholder="Enter your comments"></textarea>
_72
</div>
_72
_72
<div class="field">
_72
<label for="attach" class="ui green button">Attach file</label>
_72
<input type="file" name="attach" id="attach" value="male" name="gender" checked="checked">
_72
<label for="gender">Male</label>
_72
</div>
_72
</div>
_72
<div class="field">
_72
<div class="ui radio checkbox">
_72
<input type="radio" value="female" name="gender">
_72
<label>Female</label>
_72
</div>
_72
</div>
_72
</div>
_72
_72
<div class="ui segment">
_72
<div class="field">
_72
<div class="ui toggle checkbox">
_72
<input type="checkbox" name="checkbox" tabindex="0" class="hidden">
_72
<label>Do you wana test the checkbox (toggle check)?</label>
_72
</div>
_72
</div>
_72
</div>
_72
_72
<div class="field">
_72
<button type="submit" class="ui fluid big submit button">Send form</button>
_72
</div>
_72
</form>
_72
<div class="ui hidden message">
_72
<div class="header">Form Completed!</div>
_72
<p>Your form successfully sent!</p>
_72
</div>
_72
</div>
_72
_72
</div>
_72
_72
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.2/jquery.min.js"></script>
_72
<script src="//cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.4/semantic.min.js"></script>
_72
<script src="jquery.fajax.js"></script>
_72
<script src="main.js"></script>
_72
_72
</body>
_72
</html>

Стандартный метод


_25
$('form').submit(function(e){
_25
_25
e.preventDefault();
_25
_25
var fd = new FormData();
_25
fd.append('fullname', $('input[name="fullname"]').val());
_25
fd.append('phone', $('input[name="phone"]').val());
_25
fd.append('text', $('textarea').val());
_25
fd.append('gender', $('input[name="gender"]:checked').val());
_25
fd.append('checkbox', $('input[type="checkbox"]:checked').val());
_25
fd.append('attach', $('#attach')[0].files[0]);
_25
_25
$.ajax({
_25
url : 'https://httpbin.org/post',
_25
type : 'POST',
_25
mimeTypes: 'multipart/form-data',
_25
data : fd,
_25
processData: false,
_25
contentType: false,
_25
success : function(data) {
_25
// code...
_25
}
_25
});
_25
_25
});

И чем больше у вас AJAX форм, тем больше подобного кода, будет занимать ваш JS файл. Не особо радует. Теперь, попробуем повторить тоже, только с данным плагином.


_10
$('form').fajax({
_10
success: function(data){
_10
// code...
_10
},
_10
error: function(data){
_10
// code...
_10
}
_10
});

Как видите, разница огромная. Вам уже не потребуется добавлять в FormData() отдельно поля и файлы и это все пихать в $.ajax().

Так же, этот метод поддерживает еще два обработчика. Это beforeSend(data) и complete(data). Ниже, я дал описание каждому методу.

  • beforeSend(data) - перед отправкой формы, может выполняться данный метод. К примеру, перед отправкой формы, мы можем выводить иконку загрузки.
  • complete(data) - после отправки формы (не важно какой ответ от сервера был получен), вызывается этот метод.
  • success(data) - вызывается в случае успешной отправки запроса на сервер.
  • error(data) - вызывается ошибки, при отправке запроса на сервер.

Как вы заметили, каждый метод хранит в заголовке переменную data. В данной переменной, будет содержаться ответ от сервера, отправленный методом $.ajax().

Вот таким простым плагином, можно упростить разработку AJAX форм. К примеру, мне он очень пригодился и я его буду использовать при разработке следующих заказов.

Ниже рабочий пример данного плагина + прикрепил архив: jQuery.fajax + Demo.

Автор данного плагина Mikail Aziev (@aziev) Ссылка на репозиторий: jQuery.fajax

#fajax#form#submit#submitter#async#ajax