Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2019, 07:13   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Отправка нескольких форм на сервер

Здравствуйте.
В продолжение моей предыдущей темы я приблизился к последней задаче: все формы, которые наделал себе пользователь, нужно отправить на сервер. Допустим этих форм может быть 100500, и их нужно швырять аяксом, что бы без перезагрузки. Ну вы поняли.
Что у меня есть: полный перечень форм, как элементов DOM:
Код:
allForms=document.getElementsByClassName('variations_form');
Используя обычный JS хочу их циклом отправить, а потом обновить страницу.
В предыдущей теме я указывал ссылку на страницу-пример - здесь я уже по хозяйничал, может кому важно для подсказать.

Как это делать ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 10.04.2019, 07:52   #2
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Зачем их слать аяксом, если ты хочешь потом перезагружать страницу?
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 10.04.2019, 08:31   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Naive Посмотреть сообщение
Зачем их слать аяксом, если ты хочешь потом перезагружать страницу?
Ну кагбэ их тут не одна
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Допустим этих форм может быть 100500, и их нужно швырять аяксом, что бы без перезагрузки.
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Используя обычный JS хочу их циклом отправить, а потом обновить страницу.
Обновить страницу мне нужно только после отправки всех форм.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 10.04.2019, 21:20   #4
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Ну кагбэ их тут не одна
ну и что? Собрать скриптом в одну форму и сабмитнуть: проще чем трахаться с аяксом.
Если данных много настолько, что оно в один запрос не пролазит, то толкать промисами. Но зачем тогда обновлять страницу?

AJAX не для этого придумывался.
Это все означает, что у тебя не правильная структура HTML. Либо ты городишь стрёмный костыль.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 11.04.2019, 04:29   #5
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Naive Посмотреть сообщение
Собрать скриптом в одну форму и сабмитнуть: проще чем трахаться с аяксом
Не проще, потому что сабмит этой формы некому принимать.
Цитата:
Сообщение от Naive Посмотреть сообщение
у тебя не правильная структура HTML
Она не неправильная, она не соответствует требованиям заказчика.
Цитата:
Сообщение от Naive Посмотреть сообщение
Либо ты городишь стрёмный костыль.
Да, так и есть. В предыдущей теме об этом писал:
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Нужно мне это для того, что бы по вставлять туда своих костылей, ввиду абсурдных требований заказчика.
Только костыль получился не стрёмный, а просто эпичнейший - на данный момент 608 строк JS-кода, из которых мой код - уже 396 строк. Ещё 212 это та функция, которую я скопировал; о ней и была предыдущая тема.
Зато за этот костыль обещают нехило так заплатить.
Мне вот интересно ... Здесь я бы тоже нарвался на демагогию о том, зачем я творю такую дичь ?
Дабы не рассказывать всю подноготную - вот, почитайте трёх-страничную полемику о том, почему нужно было сделать именно так. Мой собеседник в итоге пришёл к тому же выводу что и я, когда начал копаться в данных формы. Видать понял, что придётся нехило так переделывать контроллеры на сервере.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 11.04.2019 в 04:38.
OmegaBerkut вне форума Ответить с цитированием
Старый 11.04.2019, 09:08   #6
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,156
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Используя обычный JS хочу их циклом отправить, а потом обновить страницу.
Как это делать ?
ну дык если хочешь - отправляй, в чем проблема? одну форму можешь отправить? то же самое но в цикле...

Код:
var forms = ['#form1','#form2','#form3'];

for (i=0;i++;i<forms.length) {
var data = $(forms[i]).serialize();
ajax() {
...
data : data,
... нужные параметры - куда, чего, зачем
}
}
ADSoft вне форума Ответить с цитированием
Старый 11.04.2019, 12:47   #7
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
ну дык если хочешь - отправляй, в чем проблема? одну форму можешь отправить? то же самое но в цикле...

Код:
var forms = ['#form1','#form2','#form3'];

for (i=0;i++;i<forms.length) {
var data = $(forms[i]).serialize();
ajax() {
...
data : data,
... нужные параметры - куда, чего, зачем
}
}
Ему нужно знать, когда все запросы выполнятся.
Лучше промапить массив форм и вернуть jQuery-промисы аяксов и завернуть их в $.when().
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 11.04.2019, 18:11   #8
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Мне подогнали вот такого зверя:
Код:
function Send_Click($)
{
	var frm=$('form.variations_form').slice(1);
	_f(frm.length);
	function _f(i)
	{
		i--;
		if (i<0) // это уже мой обвес
		{
			location.reload();
			return;
		} else;
		if (i==0) // и это тоже
		{
			frm[0].submit();
			return;
		} else;
		$.ajax(
		{
			type:'POST',
			url:frm.eq(i).attr('action'),
			data:frm.eq(i).serialize(),
			success:function(d)
			{
				if (i==0)
					location.reload();
				else
					_f(i);
				/*if (d)
					if (i==0)
						location.reload();
					else
						_f(i);
				else
					alert('Something wrong');*/
			}
		})
	}
}
Оно работает. Правда мне подсунули рекурсию, не знаю зачем: толи автор - фанат рекурсии, то ли решил - что я отбитый.
То же самое только в цикле:
Код:
	for (i=0;i<frm.length-1;i++)
		$.ajax(
		{
			type:'POST',
			url:frm.eq(i).attr('action'),
			data:frm.eq(i).serialize(),
			success:function(ready) { }
		})
	frm[frm.length-1].submit();
Выглядит аккуратнее, но работает не как надо - успевает обработать только одну форму, последнюю (которую намерено сабмитом кидаю).
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 11.04.2019, 20:15   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Выглядит аккуратнее, но работает не как надо - успевает обработать только одну форму, последнюю (которую намерено сабмитом кидаю).
так оставьте с рекурсией.

тут же принципиальное отличие.
в случае с рекурсией следующий вызов осуществляется только при условии, что предыдущий завершился (на событие ajax .success:function(d)) - получается такая матрёшка. Вот она работает правильно. Ваш же цикл выпуливает все формы подряд, без всяких ожиданий результата.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.04.2019, 22:21   #10
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
так оставьте с рекурсией
Так и оставил.
Но думаю, будет ти нормально отрабатывать цикл при async:false ?
Или в success:function(ready) { } воткнуть какой нибудь continue .

UPD: набросал четыре варианта
Код:
var requests=new Array();
for (i=0;i<frm.length-1;i++)
	$.when( // вариант первый - ждать каждый запрос по отдельности
		requests[i]=$.ajax(
			{
				async:false, // вариант второй - синхронные запросы
				type:'POST',
				url:frm.eq(i).attr('action'),
				data:frm.eq(i).serialize(),
				success:function(ready) { continue; } // вариант третий, сомневаюсь что будет работать
			});
	).then(function() { });
$.when.apply($,requests).then(function() { }); // вариант четвёртый - ждать все запросы
frm[frm.length-1].submit();
Даже все четыре варианта вместе выглядят аккуратнее рекурсии без обвесов.
Протестировать пока нет возможности; подскажете - какой из этих четырёх вариантов точно будет работать как полагается ?
Ставлю на то что четвёртый вариант будет наилучшим.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 11.04.2019 в 23:04.
OmegaBerkut вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск нескольких форм одновременно alexander-123 Microsoft Office Access 4 16.05.2016 16:25
Отображение нескольких форм Philippov C++ Builder 2 27.08.2012 08:22
ShowModal для нескольких форм Марк Охман Общие вопросы Delphi 9 03.12.2010 22:14
Создание нескольких форм Лера123 Общие вопросы Delphi 4 16.10.2010 18:16
Динамическое создание нескольких форм Gypsy Общие вопросы Delphi 18 21.10.2009 14:52