Risposte:
Abilitarli temporaneamente.
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
invece di disabled
come menzionato da Andrew di seguito.
Usa input di sola lettura anziché input disabilitati:
<input name='hello_world' type='text' value='hello world' readonly />
Questo dovrebbe essere raccolto da serialize ().
È possibile utilizzare una funzione proxy (influisce su entrambi $.serializeArray()
e $.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 ha fornito la risposta principale. Il mio contributo qui è solo una meraviglia di jQuery aggiungendo una funzione ad esso:
/**
* 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;
};
Esempio di utilizzo:
$("form").serializeIncludeDisabled();
Prova questo:
<input type="checkbox" name="_key" value="value" disabled="" />
<input type="hidden" name="key" value="value"/>
Riesco a vedere alcune soluzioni alternative, ma nessuno ha ancora suggerito di scrivere la tua funzione di serializzazione? Ecco qua: 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);
}
});
Gli elementi di input disabilitati non vengono serializzati perché "disabled" significa che non dovrebbero essere utilizzati, secondo lo standard W3C. jQuery rispetta solo lo standard, anche se alcuni browser non lo fanno. Puoi aggirare questo, aggiungendo un campo nascosto con un valore identico al campo disabilitato, o facendo questo tramite jQuery, qualcosa del genere:
$('#myform').submit(function() {
$(this).children('input[hiddeninputname]').val($(this).children('input:disabled').val());
$.post($(this).attr('url'), $(this).serialize, null, 'html');
});
Ovviamente, se avessi più di un input disabilitato, dovresti iterare sui selettori corrispondenti, ecc.
Nel caso in cui qualcuno non desideri attivarli, quindi disabilitarli di nuovo, puoi anche provare a farlo (l'ho modificato dai campi disabilitati non rilevati da serializeArray , dall'uso di un plugin all'utilizzo di una normale funzione):
function getcomment(item)
{
var data = $(item).serializeArray();
$(':disabled[name]',item).each(function(){
data.push({name: item.name,value: $(item).val()});
});
return data;
}
Quindi puoi chiamarli in questo modo:
getcomment("#formsp .disabledfield");
code
3: {nome: undefined, valore: ""} 4: {nome: undefined, valore: ""}
Appena sopra Aaron Hudon:
Forse hai qualcos'altro oltre a Input (come select), quindi ho cambiato
this.find(":input:disabled")
per
this.find(":disabled")
textarea
ma non un disabilitatoinput
..