Tampaknya elemen masukan yang dinonaktifkan secara default diabaikan oleh $.serialize()
. Apakah ada solusinya?
137
Tampaknya elemen masukan yang dinonaktifkan secara default diabaikan oleh $.serialize()
. Apakah ada solusinya?
textarea
tetapi bukan yang cacatinput
..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');
sumber
readonly
daripada yangdisabled
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 ().
sumber
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);
sumber
@ 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();
sumber
Coba ini:
<input type="checkbox" name="_key" value="value" disabled="" /> <input type="hidden" name="key" value="value"/>
sumber
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); } });
sumber
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.
sumber
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");
sumber
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")
sumber