Мне иногда приходится работать с большим количеством всякие инпутов, селектов и текстарей. Приходится постоянно получать их значения, т.к. данные отправляются аяксом. Меня это уже так достало, что я решил, что с этим надо что-то делать. И вот, что я придумал:
user_data = {};
function getData(parent) {
//Обходим всех детей текущего элемента
for(var childItem in parent.childNodes) {
var this_obj = parent.childNodes[childItem];
if(this_obj.nodeType == 1) {
//Обрабатываем все input
if(this_obj.tagName == 'INPUT' && this_obj.type == 'text')
user_data[this_obj.name] = this_obj.value;
//Обрабатываем все checkbox
if(this_obj.tagName == 'INPUT' && this_obj.type == 'checkbox')
user_data[this_obj.name] = this_obj.checked;
//Обрабатываем все radio
if(this_obj.tagName == 'INPUT' && this_obj.type == 'radio' && this_obj.checked == true)
user_data[this_obj.name] = this_obj.value;
//Обрабатываем все select
if(this_obj.tagName == 'SELECT')
user_data[this_obj.name] = this_obj.value;
//Обрабатываем все textarea
if(this_obj.tagName == 'TEXTAREA')
user_data[this_obj.name] = this_obj.value;
}
getData(this_obj);
}
<div id="div_form">
<table>
<tr>
<td>Имя</td>
<td><input type="test" name="fname"/></td>
</tr>
<tr>
<td>Фамилия</td>
<td><input type="test" name="lname"/></td>
</tr>
<tr>
<td>Страна</td>
<td><input type="test" name="country"/></td>
</tr>
<tr>
<td>Город</td>
<td><input type="test" name="city"/></td>
</tr>
<tr>
<td>JavaScript</td>
<td><input type="checkbox" name="js"/></td>
</tr>
<tr>
<td>PHP</td>
<td><input type="checkbox" name="php"/></td>
</tr>
<tr>
<td>Пол</td>
<td>
<select name="sex">
<option>Выбрать</option>
<option>М</option>
<option>Ж</option>
</select>
</td>
</tr>
<tr>
<td>Мне < 25</td>
<td><input type="radio" name="age" value="<25"/></td>
</tr>
<tr>
<td>Мне > 25</td>
<td><input type="radio" name="age" value=">25"/></td>
</tr>
<tr>
<td>О себе</td>
<td>
<textarea name="user_info"></textarea>
</td>
</tr>
<tr>
<td colspan="2"><input type="button" value="Получить данные" onclick="getData(this.parentNode.parentNode.parentNode.parentNode.parentNode);"/></td>
</tr>
</table>
</div>
Эта функция рекурсивно обходи всех детей указанного элемента, собирая их всех селектов, инпутов, и текстарей их имена и значения. В процессе своей работы она формирует массив(объект), вида имя:значение.
В боевых условиях еще не испытывал ее, но думаю, что получить значения большой формы, без обработки каждого ее элемента вручную - очень удобно.
Как думает? И фигня все это?
P.S. Вот сейчас пришла в голову идея, о том, что бы еще и ссылку на сам объект, из которого данные достаются, сохранить, что бы его можно было обработать после(например подсветить).
Спустя 17 минут, 1 секунда (6.09.2011 - 15:56) redreem написал(а):
jQuery.serialize делает тоже самое.
Спустя 2 минуты, 42 секунды (6.09.2011 - 15:58) ApuktaChehov написал(а):
redreem - отлично, пусть делает. Но это ведь мой велосипед! Так же можно сказать, что другой программист - практикант, сделает тоже самое за зарплату.
Спустя 3 минуты, 6 секунд (6.09.2011 - 16:01) ApuktaChehov написал(а):
redreem - ах да, забыл спросить, а вы знаете как работает jQuery.serialize?
Спустя 39 минут, 37 секунд (6.09.2011 - 16:41) redreem написал(а):
не понимаю иронии. я успешно пользуюсь сериалайзом.
Спустя 19 минут, 16 секунд (6.09.2011 - 17:00) ApuktaChehov написал(а):
redreem - что отличает программиста от пользователя? Программист как и пользователь, тоже пользуется разными "благами" программирования. И отличается программист от юзера тем, что программист не только умеет пользоваться инструментами, но и понимает как эти инструменты работают.
Вот и вся ирония. Я стремлюсь уметь делать все, а не быть зажатым в возможности всяческих фреймворков.
По этому и спрашиваю, знаете и понимаете ли вы, как работает jQuery.serialize, коли утверждаете, что jQuery.serialize делает тоже самое?
Вот и вся ирония. Я стремлюсь уметь делать все, а не быть зажатым в возможности всяческих фреймворков.
По этому и спрашиваю, знаете и понимаете ли вы, как работает jQuery.serialize, коли утверждаете, что jQuery.serialize делает тоже самое?
Спустя 4 минуты, 36 секунд (6.09.2011 - 17:05) redreem написал(а):
то что жкверивский сериалайз берет данные только из формы - это отличие не существенное. читать мораль о пользе программирования смысла не вижу, так как выложив "свои велосипеды" ваш покажется детской машинкой. а сказал про жквери только потому, что мог предположить что вам сериалайз не известен. хотел подсказать, ну раз уж вас так задело - забудем диалог
Спустя 8 минут, 46 секунд (6.09.2011 - 17:14) ApuktaChehov написал(а):
Да, не не задело. Я не очень люблю фреймворки, но понимаю их положительные качества. Бывало тут, что "перцы" считавшие что JS написан на JQ, пытались еще с кем-то спорить и кого-то учить. По этому и задаю подобные вопросы. Что бы понять с кем умею дело.
Спустя 5 минут, 38 секунд (6.09.2011 - 17:19) redreem написал(а):
да, я знаком с челом, который на вопрос "что такое жквери" отвечает: "это ВСЕ функции JS".
Спустя 2 минуты, 9 секунд (6.09.2011 - 17:21) redreem написал(а):
часто имея дело с дизайнерами-верстальщиками и демонстрируя им какую-то технологию натыкаюсь на принципиальный скептецизм. типа все уже сделано в этом мире и нам остается только понижать плоды, а делать что-то новое смысла нет.
_____________