Javascript — получение данных из формы в хэш-массив

    Простая функция, которая может быть кому-то полезна.

    Цель: отправить данные из формы методом jQuery.post() без перезагрузки страницы.
    Задача: получить данные из формы в виде хэш-массива.

    function getFormHash(formSelector)
    {      
          hash = {};
          inputs = {};
          jQuery(formSelector+' input').each(function() {
                name = jQuery(this).attr('name');
                value = jQuery(this).attr('value');
                type = jQuery(this).attr('type');
                if(name.substr(name.length-2, 2)=='[]') {
                      name = name.substr(0, name.length-2)
                      if(typeof(inputs[name])=='undefined') {
                            inputs[name]=0;
                      }
                      else {
                            inputs[name]++;
                      }
                      if(type.toUpperCase() != 'CHECKBOX' || jQuery(this).attr('checked') == true) {
                            hash[name+'['+inputs[name]+']'] = value;
                      }
                }
                else {
                      hash[name] = value;
                }
          });
    
          jQuery(formSelector+' select').each(function() {n
                name = jQuery(this).attr('name');
                multiple = jQuery(this).attr('multiple');
                if(typeof(name)!=='undefined' ) {
                      i = 0;
                      jQuery(this).children('option').each(function() {
                            if(jQuery(this).attr('selected')) {
                                  value = jQuery(this).attr('value');
                                  if(multiple==true)
                                        hash[name+'['+i+']'] = value;
                                  else
                                        hash[name] = value;
                                  i++;
                            }
                      });
                }
          });
    
          jQuery(formSelector+' textarea').each(function() {
                name = jQuery(this).attr('name');
                value = jQuery(this).html();
                hash[name] = value;
          });
          
          return hash;
    }


    Функция просто проходит по всем input, select и textarea в форме, формируя hash-массив. Учитываются имена в виде name[] и multiple для select.
    Если что-то упустил, подскажите.
    Если уже есть общеупотребимое готовое решение, тоже подскажите.

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 14

      0
      Как отформатировать код нормально? Табы и пробелы вырезаются :(
        0
        <pre*></pre*>
        текст, помещенный в тег <pre*>, не форматируется автоматически

        убрать *. читайте справку.
        +4
        Если я правильно понял назначение функции, то лично я для этого использовал плагин jQuery Form.
          0
          Ага, оно. Метод formSerialize делает почти тоже самое, только возращается строку.
          +1
          А чем функция serialize не подходит получается сразу строка имя=значение а если надо просто обьект тогда есть функция serializeArray
            0
            А плагин jquery.form стоит исполюзовать только если нужно файлы сохранять
              0
              Так, вообще-то, serialize() не из form-плагина.
                0
                Простите, с просони неправильно понял комментарий ваш, посчитал ответом автора поста :)
                0
                Мне кажется, вы не поняли суть проблемы. Serialize здесь каким местом?
                  0
                  А в чем проблема
                  $(form).submit(function()
                  {
                  $.post('url',$(this).serialize())
                  return false;
                  });
                    0
                    Да, вы правы. Я упустил из вида этот метод. Почему-то подумал про serialize как в PHP.
                0
                В своем проекте использую следующую.
                Контекстно-зависима, конечно.
                function collectInputData(section, fields_group) {
                  var input_data = {}
                  input_data['section'] = section
                  $('div#' + fields_group).find('input, select, textarea').each (
                    function() {
                      var id = $(this).attr('id')
                      if (id != '') {
                        if ($(this).attr('type') != '' && $(this).attr('type') == 'checkbox') {
                          input_data[id] = ($(this).attr('checked') ? 1 : 0)
                        } else {
                          input_data[id] = $(this).attr('value')
                        }
                      }
                    }
                  )
                  return input_data
                }

                * This source code was highlighted with Source Code Highlighter.
                  +1
                  а еще есть такой замечательный тег fieldset, и его можно использовать вместо div :")
                  0
                  Хорошая функция. Да, конечно же есть jquery.Form, но если представить, что это го плагина нет, то вещь полезная. Ее кстати тоже неплохо было б в плагин оформить, чтоб обращаться $(форма).getHash(); :-)

                  Only users with full accounts can post comments. Log in, please.