Получить поля ввода формы с помощью jQuery? - PullRequest
395 голосов
/ 04 октября 2008

У меня есть форма со многими полями ввода.

Когда я ловлю событие отправки формы с помощью jQuery, возможно ли получить все поля ввода этой формы в ассоциативном массиве?

Ответы [ 22 ]

2 голосов
/ 04 февраля 2011

Не забудьте флажки и переключатели -

var inputs = $("#myForm :input");
var obj = $.map(inputs, function(n, i) {
  var o = {};
  if (n.type == "radio" || n.type == "checkbox")
    o[n.id] = $(n).attr("checked");
  else
    o[n.id] = $(n).val();
  return o;
});
return obj
2 голосов
/ 09 мая 2017

Кажется странным, что никто не проголосовал и не предложил краткое решение для получения списка данных. Вряд ли какие-либо формы будут объектами одного измерения.

Недостатком этого решения является, конечно, то, что ваши одноэлементные объекты должны быть доступны по индексу [0]. Но IMO это намного лучше, чем использовать одно из решений для отображения десятков строк.

var formData = $('#formId').serializeArray().reduce(function (obj, item) {
    if (obj[item.name] == null) {
        obj[item.name] = [];
    } 
    obj[item.name].push(item.value);
    return obj;
}, {});
1 голос
/ 19 июня 2012

Если вам нужно получить несколько значений из входов, и вы используете [] для определения входов с несколькими значениями, вы можете использовать следующее:

$('#contentform').find('input, textarea, select').each(function(x, field) {
    if (field.name) {
        if (field.name.indexOf('[]')>0) {
            if (!$.isArray(data[field.name])) {
               data[field.name]=new Array();
            }
            data[field.name].push(field.value);
        } else {
            data[field.name]=field.value;
        }
    }                   
});
1 голос
/ 04 октября 2011

То же решение, что и для nickf , но с учетом входных имен массивов например,

<input type="text" name="array[]" />

values = {};
$("#something :input").each(function() {
  if (this.name.search(/\[\]/) > 0) //search for [] in name
  {
    if (typeof values[this.name] != "undefined") {
      values[this.name] = values[this.name].concat([$(this).val()])
    } else {
      values[this.name] = [$(this).val()];
    }
  } else {
    values[this.name] = $(this).val();
  }
});
1 голос
/ 05 сентября 2011

У меня была такая же проблема, и я решил ее по-другому.

var arr = new Array();
$(':input').each(function() {
 arr.push($(this).val());
});
arr;

Возвращает значение всех полей ввода. Вы можете изменить $(':input') на более конкретный.

1 голос
/ 22 августа 2017

Вдохновленные ответами Lance Rushing и Simon_Weaver , это мое любимое решение.

$('#myForm').submit( function( event ) {
    var values = $(this).serializeArray();
    // In my case, I need to fetch these data before custom actions
    event.preventDefault();
});

Выходные данные - это массив объектов, например,

[{name: "start-time", value: "11:01"}, {name: "end-time", value: "11:11"}]

С кодом ниже,

var inputs = {};
$.each(values, function(k, v){
    inputs[v.name]= v.value;
});

его окончательный результат будет

{"start-time":"11:01", "end-time":"11:01"}
1 голос
/ 12 июня 2017

Этот кусок кода будет работать вместо имени введите адрес вашей формы в поле

$(document).ready(function(){
  $("#form_id").submit(function(event){
    event.preventDefault();
    var name = $("input[name='name']",this).val();
    var email = $("input[name='email']",this).val();
  });
});
1 голос
/ 14 декабря 2016

Я использую этот код без каждого цикла:

$('.subscribe-form').submit(function(e){
    var arr=$(this).serializeArray();
    var values={};
    for(i in arr){values[arr[i]['name']]=arr[i]['value']}
    console.log(values);
    return false;
});
0 голосов
/ 15 апреля 2012

serialize () - лучший метод. @ Кристофер Паркер (Christopher Parker) говорит, что Nickf's anwser добивается большего, однако не учитывает, что форма может содержать текстовую область и выбирать меню. Гораздо лучше использовать serialize (), а затем манипулировать этим по мере необходимости. Данные из serialize () могут быть использованы как в Ajax-посте, так и в get, поэтому здесь нет проблем.

0 голосов
/ 05 октября 2010

Когда мне нужно было выполнить ajax-вызов со всеми полями формы, у меня возникли проблемы с селектором : input , возвращающим все флажки независимо от того, были ли они отмечены. Я добавил новый селектор, чтобы просто получить отправляемые элементы формы:

$.extend($.expr[':'],{
    submitable: function(a){
        if($(a).is(':checkbox:not(:checked)'))
        {
            return false;
        }
        else if($(a).is(':input'))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
});

использование:

$('#form_id :submitable');

Я пока не тестировал его с несколькими полями выбора, но он работает для получения всех полей формы так, как это делает стандартная отправка.

Я использовал это при настройке параметров продукта на сайте OpenCart, чтобы включить флажки и текстовые поля, а также стандартный тип блока выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...