JQuery kullanarak form giriş alanları elde etmek?


412

Birçok girdi alanı olan bir form var.

Formu gönder olayını jQuery ile yakaladığımda, bu formun tüm girdi alanlarını ilişkilendirilebilir bir dizide almak mümkün mü?


23
Bu iyi bir soru; Aslında, jQuery tam olarak bunu yapan bir işlevi olmadığını gerçekten garip buluyorum. Form verilerini iki farklı biçimde almak için işlevler vardır, ancak komut dosyası oluşturmak için en uygun olanı değil ... (Belki .val () bir form öğesinde çağrılırsa böyle bir dizi döndürmelidir?)
Luke Maurer

Yanıtlar:


524
$('#myForm').submit(function() {
    // get all the inputs into an array.
    var $inputs = $('#myForm :input');

    // not sure if you wanted this, but I thought I'd add it.
    // get an associative array of just the values.
    var values = {};
    $inputs.each(function() {
        values[this.name] = $(this).val();
    });

});

Simon_Weaver'ın ipucu sayesinde, bunu kullanarak yapabileceğiniz başka bir yol var serializeArray:

var values = {};
$.each($('#myForm').serializeArray(), function(i, field) {
    values[field.name] = field.value;
});

Bu pasajın <select multiple>öğelerde başarısız olacağını unutmayın .

Yeni HTML 5 form girişlerininserializeArray jQuery sürüm 1.3 ile çalışmadığı anlaşılıyor . Bu sürüm 1.4 ve sonraki sürümlerinde çalışır


1
JQuery'nin yeni sürümlerinde, Simon_Weaver'ın yanıtı daha sağlam ve daha kolaydır.
MightyE

1
@MightyE & @Simon_Weaver - haklısın, daha sağlam bir yöntem, ancak OP'nin aradığı şeyi tam olarak yapmıyor. serializeArray özelliklere sahip nesnelerin bir dizi döndürür nameve value. SerializeArray çıktısını gereken formatta işlemek daha iyi bir çözüm olabilir.
nickf

1
SerializeArray () tam olarak ne istediğinizi yapar ve çok daha az kod olduğunu düşünüyorum.
slacy

1
İlk seçenek için, <select>elementler ne olacak ? Denedim var $inputs = $('#new-ticket :input, :select');ama bu işe yaramıyor. Bunu yapmanın doğru yolunu bilen var mı, çünkü doğru yaptığımı sanmıyorum.
Nathan

2
@Nathan, kullanmalısın $("#new-ticket :input, #new-ticket :select"), hatta daha da iyisi,$(":input, :select", "#new-ticket")
nickf

252

Bu soru üzerine partiye geç, ama bu daha da kolay:

$('#myForm').submit(function() {
    // Get all the forms elements and their values in one step
    var values = $(this).serialize();

});

8
Bu gerçekten en iyi cevap. Hatta giriş alanlarınız için olabilecek herhangi bir dizi formatını tutar. Ben nickf tarafından cevap aslında veri yapıları Zend_Form kullanılarak oluşturulmuş, örneğin alan [bir şey] ve alan [bir şey_else] girdilerin adları olarak olurdu eğer sağlam olacağını düşünmüyorum ... en azından anlamsal olarak, nasıl olacağını göremiyorum ...
msumme

43
JQuery API belgelerine göre, .serialize()( api.jquery.com/serialize ), form öğelerinin tümünü, bir GET form isteğini taklit ederek bir sorgu dizesindeki bir URL'ye eklenmeye hazır tek bir dizeye yerleştirir. Bu, nickf'in cevabının başarısını başaramaz.
Christopher Parker

Bu en iyi cevap!
Daniel Hunter

5
Bilmeye değer: .serialize()sadece form öğeleri üzerinde de çalışır. Bu yüzden $('form select').serialize()verileri sadece seçimler için serileştirir.
antitoksik

3
Tekrarlamak yerine $('#myForm'), $ (this) kullanın.
Jimothy

23

Jquery.form eklentisi başkaları bu soru üzerine bu amaçla kadar aradıklarını ile yardımcı olabilir. İstediğinizi doğrudan yapıp yapmadığından emin değilim.

SerializeArray işlevi de vardır .


15

Bazen her seferinde bir tane almanın daha yararlı olduğunu düşünüyorum. Bunun için şu var:

var input_name = "firstname";
var input = $("#form_id :input[name='"+input_name+"']"); 

Ekleme [0].valueBu ie için $(...)[0].value;teşekkürler bana doğrudan girişin değerini verdi!
Pau Coma Ramirez

12
$('#myForm').bind('submit', function () {
  var elements = this.elements;
});

Elements değişkeni, formdaki tüm girdileri, seçimleri, metinleri ve alan kümelerini içerecektir.


9

İşte başka bir çözüm, bu şekilde form hakkındaki tüm verileri alabilir ve bir sunucu tarafı çağrısında veya başka bir şeyde kullanabilirsiniz.

$('.form').on('submit', function( e )){ 
   var form = $( this ), // this will resolve to the form submitted
       action = form.attr( 'action' ),
         type = form.attr( 'method' ),
         data = {};

     // Make sure you use the 'name' field on the inputs you want to grab. 
   form.find( '[name]' ).each( function( i , v ){
      var input = $( this ), // resolves to current input element.
          name = input.attr( 'name' ),
          value = input.val();
      data[name] = value;
   });

  // Code which makes use of 'data'.

 e.preventDefault();
}

Daha sonra bunu ajax çağrılarıyla kullanabilirsiniz:

function sendRequest(action, type, data) {
       $.ajax({
            url: action,
           type: type,
           data: data
       })
       .done(function( returnedHtml ) {
           $( "#responseDiv" ).append( returnedHtml );
       })
       .fail(function() {
           $( "#responseDiv" ).append( "This failed" );
       });
}

Umarım bu herhangi biriniz için herhangi bir kullanımdır :)


5

Hafif bir bükülme ile benzer bir sorun vardı ve ben bunu atmak düşündüm. Ben zaten bir form nesnesi vardı ve kolay varyantları bu yüzden formu alır bir geri arama işlevi var $('form:input'). Bunun yerine:

    var dataValues = {};
    form.find('input').each(
        function(unusedIndex, child) {
            dataValues[child.name] = child.value;
        });

Onun benzer ama aynı değil durum, ama ben bu konu çok yararlı buldum ve sonunda bunu tuck ve başka birinin yararlı buldum umuyordum.


4

Çağrışımsal? Biraz çalışma yapmadan değil, genel seçicileri kullanabilirsiniz:

var items = new Array();

$('#form_id:input').each(function (el) {
    items[el.name] = el;
});

aslında, Lance'in yanıtı ilişkisel diziyi POST değerleri için sağlam tutar ve bir satırlık kod alır.
msumme

öğeler neden bir dizi? düz bir nesne gibi kullanıyorsunuz. Burada diziye gerek yok
Jonathan Morales Vélez

3
@ JonathanMoralesVélez 2008'den Oli artık yorum yapmak üzere değil. 2015 yılı sizinle aynı fikirde.
Oli

4

jQuery's serializeArraydevre dışı alanları içermez, bu nedenle bunlara ihtiyacınız varsa şunları deneyin:

var data = {};
$('form.my-form').find('input, textarea, select').each(function(i, field) {
    data[field.name] = field.value;
});


4

Onay kutularını ve radyo düğmelerini unutmayın -

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

3

Bu kod parçası ad yerine çalışacaktır , e-posta form alanlarınızın adını girin

$(document).ready(function(){
  $("#form_id").submit(function(event){
    event.preventDefault();
    var name = $("input[name='name']",this).val();
    var email = $("input[name='email']",this).val();
  });
});

3

Liste verilerini almak için kimsenin özlü bir çözüm önerisi sunmadığı veya önermediği garip görünüyor. Hemen hemen hiçbir form tek boyutlu nesneler olmayacaktır.

Bu çözümün dezavantajı, elbette, singleton nesnelerinize [0] dizininden erişilmesi gerekmesidir. Ancak IMO, düzine hat haritalama çözümlerinden birini kullanmaktan çok daha iyi.

var formData = $('#formId').serializeArray().reduce(function (obj, item) {
    if (obj[item.name] == null) {
        obj[item.name] = [];
    } 
    obj[item.name].push(item.value);
    return obj;
}, {});

2

Aynı sorunu yaşadım ve farklı bir şekilde çözdüm.

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

Tüm giriş alanlarının değerini döndürür. $(':input')Daha spesifik olacak şekilde değiştirebilirsiniz .


2

Nickf tarafından verilenle aynı çözüm , ancak dizi giriş adları dikkate alınarak ör.

<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

Girişlerden birden fazla değer almanız gerekiyorsa ve girişleri birden fazla değerle tanımlamak için [] 'leri kullanıyorsanız aşağıdakileri kullanabilirsiniz:

$('#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

Lance Rushing ve Simon_Weaver'ın cevaplarından esinlenerek , bu benim en sevdiğim çözüm.

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

Çıktı bir nesne dizisidir, ör.

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

Aşağıdaki kodla,

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

nihai çıktısı

{"start-time":"11:01", "end-time":"11:01"}

1

Her döngü olmadan bu kodu kullanıyorum:

$('.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;
});

1

Umarım bu yardımcı olur, aynı zamanda en kolay olanıdır.

 $("#form").submit(function (e) { 
    e.preventDefault();
    input_values =  $(this).serializeArray();
  });

Garip bir şekilde bu jquery 3.4.1 son sürümü üzerinde çalışmadı
relipse

0

Tüm form alanları ile bir ajax çağrısı yapmak gerektiğinde, onlar kontrol edildi olsun ya da olmasın tüm onay kutularını döndürme : giriş seçici ile sorunları vardı . Yalnızca gönderilebilir form öğelerini almak için yeni bir seçici ekledim:

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

kullanımı:

$('#form_id :submitable');

Ben henüz çoklu seçim kutuları ile test etmedim ama standart bir gönderme olur gibi tüm form alanları almak için çalışır.

Bunu, bir OpenCart sitesindeki ürün seçeneklerini, onay kutularını ve metin alanlarını ve standart seçim kutusu türünü içerecek şekilde özelleştirirken kullandım.


0

serialize () en iyi yöntemdir. @ Christopher Parker, Nickf'in anwser'ının daha fazlasını başardığını söylüyor, ancak formun textarea ve belirli menüler içerebileceğini dikkate almıyor. Serialize () kullanmak ve sonra istediğiniz gibi değiştirmek çok daha iyidir. Serialize () verileri bir Ajax gönderisinde veya getinde kullanılabilir, bu yüzden orada bir sorun yoktur.


0

Umarım bu birine yardımcı olur. :)

// This html:
// <form id="someCoolForm">
// <input type="text" class="form-control" name="username" value="...." />
// 
// <input type="text" class="form-control" name="profile.first_name" value="...." />
// <input type="text" class="form-control" name="profile.last_name" value="...." />
// 
// <input type="text" class="form-control" name="emails[]" value="..." />
// <input type="text" class="form-control" name="emails[]" value=".." />
// <input type="text" class="form-control" name="emails[]" value="." />
// </form>
// 
// With this js:
// 
// var form1 = parseForm($('#someCoolForm'));
// console.log(form1);
// 
// Will output something like:
// {
// username: "test2"
// emails:
//   0: ".@....com"
//   1: "...@........com"
// profile: Object
//   first_name: "..."
//   last_name: "..."
// }
// 
// So, function below:

var parseForm = function (form) {

    var formdata = form.serializeArray();

    var data = {};

    _.each(formdata, function (element) {

        var value = _.values(element);

        // Parsing field arrays.
        if (value[0].indexOf('[]') > 0) {
            var key = value[0].replace('[]', '');

            if (!data[key])
                data[key] = [];

            data[value[0].replace('[]', '')].push(value[1]);
        } else

        // Parsing nested objects.
        if (value[0].indexOf('.') > 0) {

            var parent = value[0].substring(0, value[0].indexOf("."));
            var child = value[0].substring(value[0].lastIndexOf(".") + 1);

            if (!data[parent])
                data[parent] = {};

            data[parent][child] = value[1];
        } else {
            data[value[0]] = value[1];
        }
    });

    return data;
};

0

Tüm cevaplar iyidir, ancak bu işlevde yoksaymak istediğiniz bir alan varsa? Kolay, alana bir özellik verin, örneğin ignore_this:

<input type="text" name="some_name" ignore_this>

Ve Seri Hale Getirme Fonksiyonunuzda:

if(!$(name).prop('ignorar')){
   do_your_thing;
}

Bazı alanları görmezden gelmenin yolu budur.


1
Bu, orijinal soruyu cevaplamadığı için bir cevaptan çok bir yorumdur.
Wai Ha Lee

Belki zaten tonlarca cevabı olduğu için? Aldığı cevapların bir tamamlayıcısıdır.
Marcelo Rocha

Giriş doldurulmalı eğer zorunlu gibi bir sınıf adıyla bu uygulayacak sonra kontrol edebilirsiniz. $('.mandatory');Ve!$('.mandatory');
lharby

Değişim ignore_thisiçin data-ignore-this="true"yerine doğrulayıcı bir W3C yok kendi özelliklerini yaratma
zanderwar

0

Aşağıdaki kodu deneyin:

jQuery("#form").serializeArray().filter(obje => 
obje.value!='').map(aobj=>aobj.name+"="+aobj.value).join("&")

2
Lütfen cevabınızı açıklayın
Ling Vu

0

Birden fazla seçme öğesi için ( <select multiple="multiple">), @Jason Norwood-Young'daki çözümü çalıştırabilmek için değiştirdim.

Yanıt (yayınlandığı gibi), değeri yalnızca seçilen ilk öğeden alır, tümünü değil . Ayrıca databir JavaScript hatası başlatmadı veya geri dönmedi .

İşte yeni sürüm:

function _get_values(form) {
  let data = {};
  $(form).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();
        }
        for (let i = 0; i < field.selectedOptions.length; i++) {
          data[field.name].push(field.selectedOptions[i].value);
        }

      } else {
        data[field.name] = field.value;
      }
    }

  });
  return data
}

Kullanımı:

_get_values($('#form'))

Not: Sadece emin olmanız gerekir namesenin seçme ait olan []örneğin, bunun sonuna eklenen:

<select name="favorite_colors[]" multiple="multiple">
  <option value="red">Red</option>
  <option value="green">Green</option>
  <option value="blue">Blue</option>
</select>

-1
$("#form-id").submit(function (e) { 
  e.preventDefault();
  inputs={};
  input_serialized =  $(this).serializeArray();
  input_serialized.forEach(field => {
    inputs[field.name] = field.value;
  })
  console.log(inputs)
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.