serileştirme ve ekstra veri ile jQuery post ()


147

Ben yazı serialize()ve formun dışındaki diğer verileri göndermek mümkün olup olmadığını öğrenmek için çalışıyorum .

İşte işe yarayacağını düşündüğüm şey, ancak 'wordlist'form verilerini değil yalnızca gönderir .

$.post("page.php",( $('#myForm').serialize(), { 'wordlist': wordlist }));

Herhangi bir fikri olan var mı?

Yanıtlar:


329

serializeArray [Dokümanlar] 'ı kullanabilir ve ek veriler ekleyebilirsiniz:

var data = $('#myForm').serializeArray();
data.push({name: 'wordlist', value: wordlist});

$.post("page.php", data);

11
Hmm. Sanırım bunu benim çözümümden daha çok seviyorum :) Gelecekte yapmaya başlayabilirim.
Michael Mior

@Gudradain: Çok iyi çalışıyor: jsfiddle.net/fnjncqhv . Sizin için işe yaramazsa, farklı bir sorunla karşılaşıyorsunuz.
Felix Kling

Hayır değil. jsfiddle.net/fnjncqhv/1 serializeArray (), her biri tek bir özellik içeren bir nesne dizisi üretir, veri nesneniz 1'den fazla özellik içeriyorsa (örneğin örnekte olduğu gibi), geçersiz bir nesne üretir ve sunucu tarafı. Sorunu çözmek için lütfen yanıtınızı düzenleyin.
Gudradain

2
@Gudradain: Lütfen cevabınızdaki yorumuma bakın. Hatalısınız. serializeArraydüşündüğünüz yapıyı üretmez. Demonuzla ne göstermeye çalıştığınızdan emin değilim. Sadece dizinin uzunluğunu uyarıyorsunuz. Benim ise demo sizi ikna etmez bir göz lütfen belgelere .
Felix Kling

1
@FelixKling O başarısız an için özür dilerim ve açıklama için teşekkür ederim. Eklemek istediğiniz her parametre için gerçekten {name: 'your-paramater-name', value: 'your-parametre-değer'} biçimine ihtiyacınız olduğunu fark etmedim.
Gudradain


9

Bunu bir ajax dosya yüklemesinde yapmanız gerektiğinde alternatif bir çözüm:

var data = new FormData( $('#form')[0] ).append( 'name' , value );

VEYA daha da basit.

$('form').on('submit',function(e){

    e.preventDefault();
    var data = new FormData( this ).append('name', value );

    // ... your ajax code here ...

    return false;

});

5

Form verilerine bir javascript nesnesi eklemek istediğinizde, aşağıdaki kodu kullanabilirsiniz

var data = {name1: 'value1', name2: 'value2'};
var postData = $('#my-form').serializeArray();
for (var key in data) {
    if (data.hasOwnProperty(key)) {
        postData.push({name:key, value:data[key]});
    }
}
$.post(url, postData, function(){});

Veya serializeObject () yöntemini eklerseniz aşağıdakileri yapabilirsiniz

var data = {name1: 'value1', name2: 'value2'};
var postData = $('#my-form').serializeObject();
$.extend(postData, data);
$.post(url, postData, function(){});

1
Bu temelde benzeyen bir dizi oluşturur [{name: 'wordlist'}, {value: wordlist}]. Bu, jQuery'nin anladığı bir formatta değil, bu yüzden gerçekten çalıştığından şüpheliyim.
Felix Kling

@FelixKling serializeArray () [{name1: 'value1'}, {name2: 'value2'}] üretir. Bir nesne verileriniz {name3: 'value3', name4: 'value4'} varsa ve serializeArray () 'dan diziye iterseniz, [{name1:' value1 '}, {name2:' value2 '}, { name3: 'değer3', ad4: 'değer4'}]. Dizideki son nesne geçersizdir ve sonuç elde edemezsiniz.
Gudradain

" serializeArray()üretmek [{name1: 'value1'}, {name2: 'value2'}]." Hayır, öyle değil: jsfiddle.net/akyz1Lcy
Felix Kling

4

Jquery'nin yeni sürümünde, aşağıdaki adımlarla yapılabilir:

  • üzerinden param dizisi al serializeArray()
  • push()diziye ek parametreler eklemek için çağrı veya benzeri yöntemler,
  • $.param(arr)jquery ajax dataparametresi olarak kullanılabilen serileştirilmiş dize almak için çağrı yapın .

Örnek kod:

var paramArr = $("#loginForm").serializeArray();
paramArr.push( {name:'size', value:7} );
$.post("rest/account/login", $.param(paramArr), function(result) {
    // ...
}

3
$.ajax({    
    type: 'POST',  
    url: 'test.php',  
    data:$("#Test-form").serialize(),  
    dataType:'json',
     beforeSend:function(xhr, settings){
     settings.data += '&moreinfo=MoreData';
     },
    success:function(data){
            //  json response  
    },
    error: function(data) { 
        // if error occured
    }
    });

2

Formun, AJAX isteğini karşılık gelen değerlere göndermeden hemen önce ayarlayacağınız ek verileri gizli alanlar olarak içermesini sağlayabilirsiniz.

Başka bir olasılık, formunuzu bir javascript nesnesine (dize yerine) serileştirmek ve eksik verileri eklemek için bu küçük gemiyi kullanmaktır :

var data = $('#myForm').serializeObject();
// now add some additional stuff
data['wordlist'] = wordlist;
$.post('/page.php', data);

Adında varolan bir işlev yok serializeObject. Bunu nereden aldın?
Jereme

1

Bunu kullanabilirsiniz

var data = $("#myForm").serialize();
data += '&moreinfo='+JSON.stringify(wordlist);

0

Nesneleri nesne olarak tutmayı ve çılgın tip değiştirmeyi sevmem. İşte benim yolum

var post_vars = $('#my-form').serializeArray();
$.ajax({
  url: '//site.com/script.php',
  method: 'POST',
  data: post_vars,
  complete: function() {
    $.ajax({
      url: '//site.com/script2.php',
      method: 'POST',
      data: post_vars.concat({
        name: 'EXTRA_VAR',
        value: 'WOW THIS WORKS!'
      })
    });
  }
});

Yukarıdan göremiyorsanız .concat işlevini kullandım ve post değişkenine 'name' ve değeri 'value' olarak aktardım!

Bu yardımcı olur umarım.

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.