Tampaknya elemen masukan yang dinonaktifkan secara default diabaikan oleh $.serialize()
. Apakah ada solusinya?
Jawaban:
Aktifkan untuk sementara.
var myform = $('#myform');
// Find disabled inputs, and remove the "disabled" attribute
var disabled = myform.find(':input:disabled').removeAttr('disabled');
// serialize the form
var serialized = myform.serialize();
// re-disabled the set of inputs that you previously enabled
disabled.attr('disabled','disabled');
readonly
daripada yang disabled
disebutkan oleh Andrew di bawah ini.
Gunakan input hanya-baca, bukan input yang dinonaktifkan:
<input name='hello_world' type='text' value='hello world' readonly />
Ini harus diambil oleh serialize ().
Anda dapat menggunakan fungsi yang diproksikan (ini memengaruhi keduanya $.serializeArray()
dan $.serialize()
):
(function($){
var proxy = $.fn.serializeArray;
$.fn.serializeArray = function(){
var inputs = this.find(':disabled');
inputs.prop('disabled', false);
var serialized = proxy.apply( this, arguments );
inputs.prop('disabled', true);
return serialized;
};
})(jQuery);
@ user113716 memberikan jawaban inti. Kontribusi saya di sini hanyalah kebaikan jQuery dengan menambahkan fungsi ke dalamnya:
/**
* Alternative method to serialize a form with disabled inputs
*/
$.fn.serializeIncludeDisabled = function () {
let disabled = this.find(":input:disabled").removeAttr("disabled");
let serialized = this.serialize();
disabled.attr("disabled", "disabled");
return serialized;
};
Contoh penggunaan:
$("form").serializeIncludeDisabled();
Coba ini:
<input type="checkbox" name="_key" value="value" disabled="" />
<input type="hidden" name="key" value="value"/>
Saya dapat melihat beberapa solusi, tetapi masih tidak ada yang menyarankan untuk menulis fungsi serialisasi Anda sendiri? Ini dia: https://jsfiddle.net/Lnag9kbc/
var data = [];
// here, we will find all inputs (including textareas, selects etc)
// to find just disabled, add ":disabled" to find()
$("#myform").find(':input').each(function(){
var name = $(this).attr('name');
var val = $(this).val();
//is name defined?
if(typeof name !== typeof undefined && name !== false && typeof val !== typeof undefined)
{
//checkboxes needs to be checked:
if( !$(this).is("input[type=checkbox]") || $(this).prop('checked'))
data += (data==""?"":"&")+encodeURIComponent(name)+"="+encodeURIComponent(val);
}
});
Elemen masukan yang dinonaktifkan tidak dapat diserialkan karena 'nonaktif' berarti elemen tersebut tidak boleh digunakan, sesuai standar W3C. jQuery hanya mematuhi standar, meskipun beberapa browser tidak. Anda dapat mengatasinya, dengan menambahkan bidang tersembunyi dengan nilai yang identik dengan bidang yang dinonaktifkan, atau dengan melakukan ini melalui jQuery, seperti ini:
$('#myform').submit(function() {
$(this).children('input[hiddeninputname]').val($(this).children('input:disabled').val());
$.post($(this).attr('url'), $(this).serialize, null, 'html');
});
Jelas, jika Anda memiliki lebih dari satu masukan yang dinonaktifkan, Anda harus mengulang-ulang pemilih yang cocok, dll.
Jika seseorang tidak ingin mengaktifkannya, maka nonaktifkan lagi, Anda juga dapat mencoba melakukan ini (Saya memodifikasinya dari kolom Nonaktif yang tidak diambil oleh serializeArray , dari menggunakan plugin menjadi menggunakan fungsi normal):
function getcomment(item)
{
var data = $(item).serializeArray();
$(':disabled[name]',item).each(function(){
data.push({name: item.name,value: $(item).val()});
});
return data;
}
Jadi Anda bisa memanggil mereka seperti ini:
getcomment("#formsp .disabledfield");
code
3: {name: undefined, value: ""} 4: {name: undefined, value: ""}
Tepat di atas Aaron Hudon:
Mungkin Anda punya sesuatu selain Input (seperti pilih), jadi saya berubah
this.find(":input:disabled")
untuk
this.find(":disabled")
textarea
tetapi bukan yang cacatinput
..