jQuery - tambahkan parameter tambahan saat kirim (BUKAN ajax)


206

Menggunakan 'kirim' jQuery - apakah ada cara untuk memberikan parameter tambahan ke formulir? Saya TIDAK ingin melakukan ini dengan Ajax - ini adalah normal, penyerahan formulir khas.

$('#submit').click(function () {
    $('#event').submit(function () {
        data: { 
        form['attendees'] = $('#attendance').sortable('toArray').toString();
    });
});

Teknologi sisi server mana yang Anda gunakan?
Enrique

Lihat jawaban saya [di sini] [1], yang ditambahkan ke formulir berseri sebelum dikirimkan. [1]: stackoverflow.com/questions/17809056/…
Jeff Lowery

Jawaban:


371

Yang ini melakukannya untuk saya:

var input = $("<input>")
               .attr("type", "hidden")
               .attr("name", "mydata").val("bla");
$('#form1').append(input);

didasarkan pada jawaban Daff, tetapi menambahkan atribut NAME untuk membiarkannya ditampilkan dalam koleksi formulir dan mengubah VALUE menjadi VAL Juga memeriksa ID FORMULIR (form1 dalam kasus saya)

menggunakan firebug Firefox untuk memeriksa apakah elemen telah dimasukkan.

Elemen tersembunyi dapat dikirim kembali ke koleksi formulir, hanya bidang baca-saja yang dibuang.

Michel


46
Bagaimana saya menyanyikan 'you is my sunshine' dalam biner? Terima kasih banyak. Ini memecahkan banyak hal.
Ciel

38
Anda dapat sedikit meningkatkan keterbacaan: var input = $ ("<input>", {type: "hidden", name: "mydata", value: "bla"}); $ ('# form1'). append ($ (input));
Konstantine Kalbazov

2
$ ("<input>") .attr ("type", "hidden"). attr ("name", "mydata"). val ("bla"). appendTo ('# form1'); adalah cara lain
kiev

6
Saya menyukai kombo: $ ("<input>", {type: "hidden", name: "mydata", nilai: "bla"}). AppendTo ("# form1");
gabeio

Apakah tidak ada batasan ukuran data? Saya mengirim beberapa objek besar menggunakan JSON.stringify (obj) dan metode ini dan tampaknya terpotong.
omikron

26

Dalam kasus Anda, cukup menambahkan bidang tersembunyi lain ke formulir secara dinamis.

var input = $("<input>").attr("type", "hidden").val("Bla");
$('#form').append($(input));

Data yang saya perlu kirimkan tidak mampu bentuk. Itu harus ditangkap dan ditangani di sisi server.
Ciel

Apa yang Anda maksud dengan "tidak mampu membentuk"?
Vincent Ramdhanie

Maaf - ini tidak berhasil sama sekali. Bahkan dengan data yang dipaksakan saja, itu tidak menyuntikkan ke dalam formulir.
Ciel

Itu tidak bisa ditempatkan di bidang formulir.
Ciel

2
Jika sebuah string dapat dimasukkan ke dalam form isian
PetersenDidIt

19

Anda bahkan dapat menggunakan yang ini. bekerja dengan baik untuk saya

$("#registerform").attr("action", "register.php?btnsubmit=Save") 
$('#registerform').submit();

ini akan mengirimkan btnsubmit = Simpan sebagai nilai GET ke formulir register.php.


Ini sepertinya solusi yang lebih elegan. Hanya ingat untuk menggunakan encodeURIComponent()nilai parameter tergantung pada jenis data.
Andres SK

1
Yang ini sebenarnya lebih baik ketika memungkinkan pengguna mengirimkan formulir beberapa kali. Formulir tidak akan mendapatkan lebih dari satu bidang tersembunyi dengan nilai yang berbeda.
Mellon

11

Anda bisa menulis fungsi jQuery yang memungkinkan Anda menambahkan bidang tersembunyi ke formulir:

// This must be applied to a form (or an object inside a form).
jQuery.fn.addHidden = function (name, value) {
    return this.each(function () {
        var input = $("<input>").attr("type", "hidden").attr("name", name).val(value);
        $(this).append($(input));
    });
};

Dan kemudian tambahkan bidang tersembunyi sebelum Anda mengirim:

var frm = $("#form").addHidden('SaveAndReturn', 'Save and Return')
                    .submit();

1
Lihat stackoverflow.com/questions/2601223/... untuk versi lebih lanjut dari addHidden
Jonathan

1
Saya suka kesederhanaan dari solusi ini. Itu tidak menangani banyak kasus tetapi juga menangani kasus itu.
Phil

11

Anda tidak perlu mengikat acara ajukan dengan mengklik tombol kirim, cukup ikat acara ajukan dan itu akan menangkap acara ajukan, tidak peduli bagaimana hal itu dipicu.

Pikirkan apa yang Anda inginkan adalah mengirimkan sortable seperti yang Anda lakukan melalui ajax. Coba lakukan sesuatu seperti ini:

var form = $('#event').submit(function () {
    $.each($('#attendance').sortable('toArray'),function(i, value){
        $("<input>").attr({
            'type':'hidden',
            'name':'attendace['+i+']'
        }).val(value).appendTo(form);
    });
});

masih tidak muncul di formcollection sisi server ... adakah sesuatu yang khusus harus saya lakukan untuk mendapatkan bidang tersembunyi untuk muncul di server? Itu akan melalui C # / ASP.NET MVC menggunakan objek FormCollection.
Ciel

Memperbarui jawaban saya, pikir saya melakukan dan apa yang Anda coba lakukan.
PetersenDidIt

Apakah Anda menambahkan nameatribut ke input formulir tersembunyi yang dihasilkan? Per stackoverflow.com/questions/504681/… sepertinya objek FormCollection membutuhkan semua <input>elemen untuk memiliki nama.
npdoty

Ya, saya mencoba untuk mendorong sortable ke formcollection sebagai serangkaian nilai yang dipisahkan koma. Saya sudah mencoba pembaruan Anda dan masih belum memposting. Saya tidak yakin apa yang saya lakukan salah ... Saya menghargai bantuannya.
Ciel

Sepertinya masalahnya bukan pada sisi klien tetapi sisi server.
PetersenDidIt

2

Jawaban serupa, tetapi saya hanya ingin membuatnya tersedia untuk tes mudah / cepat.

var input = $("<input>")
               .attr("name", "mydata").val("go Rafa!");

$('#easy_test').append(input);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>



<form id="easy_test">
  
</form>

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.