Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Отправка формы с помощью XMLHttpRequest2 и FormData (https://javascript.ru/forum/jquery/22067-otpravka-formy-s-pomoshhyu-xmlhttprequest2-i-formdata.html)

pav 05.10.2011 01:38

Отправка формы с помощью XMLHttpRequest2 и FormData
 
Нужно было реализовать сабж. Затык в том, что $.ajax не поддерживает отправку данных, которые генерирует FormData, и соотв. код
options.data = new FormData($('#formId').get(0));
$.ajax(options);

возвращает ошибку.

Время поджимало, и я написал костыль:
$.aajax = function(options){
	var status;
	var xhr = $.ajaxSettings.xhr();
	xhr.timeout = cfg.timeout;
	(options.beforeSend) ? options.beforeSend() : $.ajaxSettings.beforeSend();
	xhr.open('POST',options.url);
	xhr.setRequestHeader('X-Requested-With','XMLHttpRequest');
	xhr.onreadystatechange = function(){
		if(xhr.readyState == 4){
			if(xhr.status == 200){
				(options.success) ? options.success(xhr.responseText) : $.ajaxSettings.success(xhr,xhr.responseText);
				status = 'success';
			}else{
				status = 'error';
			}
			clearTimeout(timeout);
			(options.complete) ? options.complete(xhr,status) : $.ajaxSettings.complete(xhr,status);
		}
	};
	xhr.send(options.data);
	var timeout = setTimeout(function(){xhr.abort(); status='timeout'; $.ajaxSettings.complete(xhr,status)},cfg.timeout);
};

В событии отправки формы проверяется проверка наличия у юзера FormData и, если есть, отправка идет с помощью представленной выше функции. Собственно, вопрос: есть ли готовый плагин для поддержки отправки таких данных с помощью стандартного $.ajax? Не загрузку файлов по отдельности, а именно отправки всей формы. jquery.form делает это костылем со скрытым iframe, который по ряду причин нежелателен. Мой плагин, написанный на скорую руку, многих плюшек jquery не поддерживает, а дописывать их поддержку лень. Гугл обиделся и ничего подходящего не выдал. Помогите советом, братья-кодеры :)

zebra 05.10.2011 03:23

Цитата:

Сообщение от pav
$('#formId').get(0)

Делаете выборку по id и ищите в найденном 1-эй элемент?:nono:

pav 05.10.2011 07:45

Цитата:

Сообщение от zebra (Сообщение 129628)
Делаете выборку по id и ищите в найденном 1-эй элемент?:nono:

Нет же, читайте документацию:
Цитата:

get( )

Обзор
Опции
Примеры
Обсуждение

Обращается к массиву объектов DOM.

Служит как обратно-совместимый способ доступа ко всем совпавшим элементам (помимо самого объекта jQuery, который, по сути, есть массив элементов). Данным методом целесообразно пользоваться, когда Вам необходимо работать над самими элементами DOM вместо использования встроенных функций jQuery.
Т.е. $('#id').get(0) == $('#id')[0], да и с моим костылем все отправляется прекрасно, я просто ищу более функциональный метод. Кстати, в опере(даже последней) не работает FormData, а jquery.form некорректно работает с формами, в которых несколько файлов. Придется, наверное, сначала выдирать из формы файлы, отправлять их(например, plupload) и в серверном скрипте класть в сессию имена загруженных в /tmp файлов, а после получения ответа уже отправлять форму с только текстовыми данными.

pav 05.10.2011 10:16

В общем, решил проблему полной сменой алгоритма загрузки:
1. выбираем файлы и заливаем во временную папку с помощью любого предназначенного для этого плагина, а в сессию(в серверном скрипте, реализующем загрузку) кладем название файла(или файлов)
2. отправляем текстовые данные из формы на указанный в форме адрес и в принимающем скрипте распарсиваем нужную сессию вместо массива $_FILES.
3. ???
4. PROFIT

Кстати, почти такой же способ используется вконтактике, оттуда и позаимствовал :p


Часовой пояс GMT +3, время: 02:43.