mrusklon
@mrusklon
Не получается? Яростно гугли!

Как можно оптимизировать код ajax отправки формы для многократного использования?

собственно есть у меня на сайте много форм , они все однотипные отличаются только мелочью. Я использую код для отправки форм вот такой:
$("#form").submit(function () { //Change
        var th = $(this);
        $.ajax({
            type: "POST",
            url: "mail.php", //Change
            data: th.serialize()
        }).done(function () {
            $.fancybox.open({
                src  : '#thx',
                type : 'inline'
            });
            setTimeout(function () {
                th.trigger("reset");
                $.fancybox.close();
            }, 7000);
        });
        return false;
    });

вся загвоздка в том что я постоянно привязываю форму к id , каждой форме свой id и потом плодится 100500 таких вот кусочков кода отличающиеся только id'шником
пробовал поставить через класс но что то я делаю не так или это вообще не возможно , подскажите как быть , спасибо!
  • Вопрос задан
  • 258 просмотров
Решения вопроса 2
stanislav-belichenko
@stanislav-belichenko
Backend PHP Developer
пробовал поставить через класс но что то я делаю не так или это вообще не возможно


Нет, это возможно, и ход мыслей у вас абсолютно верный. Скорее всего, вы ошиблись при написании селекторов в $("#form").submit(...). Если у вас на странице все формы именно те, что вам нужно обрабатывать указанным скриптом, то вам достаточно написать вот так: $("form").submit(...). Если же у вас есть еще какие-то формы, которые нужно обрабатывать иным способом, то вам следует придумать некий класс для обсуждаемых форм, и делать по ним выборку таким образом: $("form.some-class").submit(...).
Ответ написан
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
$(function () {
    $('[data-toggle="ajax"]').on('submit', function (e) {
        e.preventDefault();
        let $form        = $(this);
        let $formLoading = $('.ajax-form__loading', $form);
        let $button      = $('[type="submit"]', $form);

        let data     = $form.serialize();
        let action   = $form.data('action') || $form.attr('action');
        let method   = $form.attr('method');
        let response = $form.data('response') || 'html';


        console.log('Response type: ', response);

        $button.attr('disabled', true);
        $formLoading.addClass('show');
        $form.trigger('beforeSend');

        $.ajax({
            url     : action,
            type    : method,
            data    : data,
            dataType: response
        }).then(function (data) {
            console.log('success', arguments);
            $formLoading.removeClass('show');
            $button.attr('disabled', false);
            $form.trigger('success', [data]);
        }).fail(function () {
            console.log('error', arguments);
            $formLoading.removeClass('show');
            $button.attr('disabled', false);
            $form.trigger('error');
        });
    });
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
freecoder-ru
@freecoder-ru
Так это зависит куда передаёте информацию с форм , так как с каждой формы другая инфа и она может посылатся на другой .php (другой путь) ..
Если я понял вас правильно то просто надо просмотреть с каких форм отправляется та же data и куда и на основе этого сделать универсальный код AJAX обработчик который будет обрабатывать несколько форм.
Ответ написан
Fragster
@Fragster
помогло? отметь решением!
Вот мой велосипед, посылающий данные формы или объекта с нужной структрурой по alax, адаптируйте под себя.
spoiler
$.fn.serializeObject = function ()
{
	var o = {};
	var a = this.serializeArray();
	$.each(a, function () {
		if (o[this.name]) {
			if (!o[this.name].push) {
				o[this.name] = [o[this.name]];
			}
			o[this.name].push(this.value || '');
		} else {
			o[this.name] = this.value || '';
		}
	});
	return o;
};

function sendForm(form, data) {
	return new Promise((fulfill, reject) => {
		if (!data)
			data = $(form).serializeObject();
//		console.log(`${form.method} ${form.action}`);
		var ajaxSettings = {
			method: form.method,
			url: form.action,
			data: JSON.stringify(data),
			//					dataType: form.method === 'get' ? 'jsonp' : 'json',
			dataType: 'json',
			contentType: 'application/json',
			processData: false,
			xhrFields: {
				withCredentials: true
			}
		};
		var ajaxRequest = $.ajax(ajaxSettings);
		ajaxRequest.done((data, textStatus) => {
			console.log(textStatus);
			console.log(JSON.stringify(data, null, 2));
			fulfill(data);
		});
		ajaxRequest.fail((response, textStatus, errorThrown) => {
			console.log(textStatus);
			console.log(errorThrown);
			if (response.status === 401) {
				screenLogin();
			} else if (response.responseText) {
				var data = JSON.parse(response.responseText);
				console.log(JSON.stringify(data, null, 2));
			} else {
				console.log(errorThrown);
			}
			reject(data);
		});
	});
}


использование:

$('#formLogin').on('submit', (event) => {
  sendForm(event.target)
    .then(data => {
////
    }).catch(error => {
/////
    });
  return false;
});

или (для не-форм)
sendForm({method: "POST", action: '/templates/'}, {id: form.filter_id}).then(data => {
/////// обработка
	});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы