Yanıtlar:
Geçici olarak etkinleştirin.
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
yerine disabled
aşağıda Andrew tarafından belirtildiği gibi.
Devre dışı girişler yerine salt okunur girişleri kullanın:
<input name='hello_world' type='text' value='hello world' readonly />
Bu serialize () tarafından alınmalıdır.
Bir proxy işlevini (hem etkiler kullanabilirsiniz $.serializeArray()
ve $.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 temel cevabı verdi. Buradaki katkım, ona bir işlev ekleyerek sadece bir jQuery nicety:
/**
* 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;
};
Örnek kullanım:
$("form").serializeIncludeDisabled();
Bunu dene:
<input type="checkbox" name="_key" value="value" disabled="" />
<input type="hidden" name="key" value="value"/>
Birkaç geçici çözüm görebiliyorum, ama yine de kimse kendi serileştirme işlevinizi yazmayı önermedi? İşte başlıyoruz: 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);
}
});
Devre dışı bırakılan giriş öğeleri serileştirilmez, çünkü 'devre dışı', W3C standardına göre kullanılmamaları gerektiği anlamına gelir. jQuery, bazı tarayıcılarda bulunmasa bile standartlara uymaktadır. Devre dışı bırakılan alanla aynı değere sahip gizli bir alan ekleyerek veya bunu jQuery aracılığıyla aşağıdaki gibi bir şey yaparak bu sorunu çözebilirsiniz:
$('#myform').submit(function() {
$(this).children('input[hiddeninputname]').val($(this).children('input:disabled').val());
$.post($(this).attr('url'), $(this).serialize, null, 'html');
});
Açıkçası, birden fazla devre dışı girişiniz varsa, eşleşen seçiciler vb. Üzerinden yineleme yapmanız gerekir.
Birisi onları etkinleştirmek istemezse, sonra tekrar devre dışı bırakırsanız, bunu da deneyebilirsiniz (bunu, serializeArray tarafından alınmayan Devre dışı alanlardan , bir eklenti kullanmaktan normal bir işlevi kullanmaya kadar değiştirdim):
function getcomment(item)
{
var data = $(item).serializeArray();
$(':disabled[name]',item).each(function(){
data.push({name: item.name,value: $(item).val()});
});
return data;
}
Böylece onlara şöyle diyebilirsiniz:
getcomment("#formsp .disabledfield");
code
3: {ad: undefined, değer: ""} 4: {name: undefined, değer: ""}
Aaron Hudon'un hemen üzerinde:
Belki de Input'dan (select gibi) başka bir şey var, bu yüzden değiştirdim
this.find(":input:disabled")
için
this.find(":disabled")
textarea
ama bir engelli değilinput
..