Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как получить все данные формы? (https://javascript.ru/forum/misc/25764-kak-poluchit-vse-dannye-formy.html)

FINoM 14.02.2012 21:20

Как получить все данные формы?
 
Нужно получить информацию всех селектов, инпутов, текстарей и пр. Конечно, это можно сделать перебором. Но, подозреваю, есть какой-нибудь метод или свойство.

devote 14.02.2012 21:34

function getFormData( form ) {
	var str = '';
	var gE = 'getElementsByTagName';
	var inputs = [
		(form[gE] ? form[gE]('input') : form.all ? form.all.tags('input') : []),
		(form[gE] ? form[gE]('select') : form.all ? form.all.tags('select') : []),
		(form[gE] ? form[gE]('textarea') : form.all ? form.all.tags('textarea') : [])
	];

	var Globals = new Array();
	var fields = new Array();
	for (var i = 0; i < inputs.length; i++)
	{
		for (j = 0; j < inputs[i].length; j++)
		{
			if (inputs[i][j])
			{
				var plus = '++'.substring(0,1);
				if(escape(inputs[i][j].getAttribute('name')).replace(plus, '%2B') !== 'null')
				{
					fields[inputs[i][j].getAttribute('name')] = inputs[i][j];
					str += escape(inputs[i][j].getAttribute('name')).replace(plus, '%2B');
					str += '=' + escape(inputs[i][j].value).replace(plus, '%2B') + '&';
					var names = inputs[i][j].getAttribute('name').split('[');
					if ( names.length ) {
						var temp = Globals;
						for(k = 0; k < names.length; k++){
							if (k > 0){
								var name = names[k].substring(0, names[k].length - 1);
							} else {
								var name = names[k];
							}

							if (!temp[name])
							{
								if (k < (names.length - 1))
								{
									temp[name] = new Array();
								} else {
									temp[name] = ((inputs[i][j].value) ? inputs[i][j].value : "");
								}
							}
							temp = temp[name];
						}
					}
				}
			}
		}
	}

	return {"action": form.action, "request": str, "data": Globals, "fields": fields}
}

FINoM 14.02.2012 21:46

nasqad, спасибо, в проекте использую его, поэтому воспользуюсь.
devote, что-то много получилось буков. Но всё равно возьму на заметку.

poorking 14.02.2012 22:14

devote,
А для чего вот это

var plus = '++'.substring(0,1);


Почему не просто, "+" ?

devote 14.02.2012 22:15

Цитата:

Сообщение от FINoM
devote, что-то много получилось буков. Но всё равно возьму на заметку.

Да это я у себя в борохле вытащил, старое какое то кусок кода, давно где то копирнул... мусора то в нем полно, но что делать с этим дальше думаю поймешь :D

devote 14.02.2012 22:16

Цитата:

Сообщение от poorking (Сообщение 157462)
devote,
А для чего вот это

var plus = '++'.substring(0,1);


Почему не просто, "+" ?

Понятия не имею, не я писал этот код :D

DreamTheater 14.02.2012 22:30

function getData(form) {
    return Array.prototype.map.call(form, function (field) {
        return {
            name: field.name,
            value: field.value
        };
    });
}


Как-то так.

devote 14.02.2012 22:33

Цитата:

Сообщение от DreamTheater
Как-то так.

не особо правильно с учетом того что инпуты с типом radio и одним именем не должны попадать все в массив, а лишь то которое выбрано. Чекбоксы тоже лишь те что чекнуты. Поля с одинаковым именем вообще не должны попасть оба.

DreamTheater 14.02.2012 22:35

Цитата:

Сообщение от devote (Сообщение 157469)
не особо правильно с учетом того что инпуты с типом radio и одним именем не должны попадать все в массив, а лишь то которое выбрано.

Ну это ведь в качестве примера, можно сделать дополнительную обработку для радио.

devote 14.02.2012 22:40

Цитата:

Сообщение от DreamTheater
Ну это ведь в качестве примера, можно сделать дополнительную обработку для радио.

Ну а кто бы спорил :) Я подал идею для примера, хоть и не писал ее сам, а дальше FINoM разберется.


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