Antworten:
Aktivieren Sie sie vorübergehend.
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
anstatt disabled
wie von Andrew unten erwähnt.
Verwenden Sie schreibgeschützte Eingänge anstelle von deaktivierten Eingängen:
<input name='hello_world' type='text' value='hello world' readonly />
Dies sollte von serialize () übernommen werden.
Sie können eine Proxy-Funktion verwenden (sie betrifft beide $.serializeArray()
und $.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 lieferte die Kernantwort. Mein Beitrag hier ist nur eine jQuery-Freundlichkeit, indem ich ihm eine Funktion hinzufüge:
/**
* 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;
};
Anwendungsbeispiel:
$("form").serializeIncludeDisabled();
Versuche dies:
<input type="checkbox" name="_key" value="value" disabled="" />
<input type="hidden" name="key" value="value"/>
Ich kann einige Problemumgehungen sehen, aber noch hat niemand vorgeschlagen, eine eigene Serialisierungsfunktion zu schreiben. Los geht's: 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);
}
});
Deaktivierte Eingabeelemente werden nicht serialisiert, da "deaktiviert" bedeutet, dass sie gemäß W3C-Standard nicht verwendet werden sollten. jQuery hält sich nur an den Standard, obwohl einige Browser dies nicht tun. Sie können dies umgehen, indem Sie ein verstecktes Feld mit einem Wert hinzufügen, der mit dem deaktivierten Feld identisch ist, oder indem Sie dies über jQuery tun:
$('#myform').submit(function() {
$(this).children('input[hiddeninputname]').val($(this).children('input:disabled').val());
$.post($(this).attr('url'), $(this).serialize, null, 'html');
});
Wenn Sie mehr als eine deaktivierte Eingabe hätten, müssten Sie natürlich über übereinstimmende Selektoren usw. iterieren.
Falls jemand sie nicht aktivieren und dann wieder deaktivieren möchte, können Sie dies auch versuchen (ich habe sie von deaktivierten Feldern, die nicht von serializeArray erfasst wurden , von der Verwendung eines Plugins zur Verwendung einer normalen Funktion geändert ):
function getcomment(item)
{
var data = $(item).serializeArray();
$(':disabled[name]',item).each(function(){
data.push({name: item.name,value: $(item).val()});
});
return data;
}
Sie können sie also so nennen:
getcomment("#formsp .disabledfield");
code
3: {name: undefined, value: ""} 4: {name: undefined, value: ""}
Gleich hinter Aaron Hudon:
Vielleicht hast du etwas anderes als Input (wie select), also habe ich mich geändert
this.find(":input:disabled")
zu
this.find(":disabled")
textarea
aber keine deaktivierte serialisieren könneninput
.