Wie kann ich dafür sorgen, dass $ .serialize () die deaktivierten Eingabeelemente berücksichtigt?

135

Es scheint, dass deaktivierte Eingabeelemente standardmäßig von ignoriert werden $.serialize(). Gibt es eine Problemumgehung?

fms
quelle
Es ist noch seltsamer, weil Sie eine deaktivierte, textareaaber keine deaktivierte serialisieren können input.
daVe

Antworten:

233

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');
user113716
quelle
26
eine Überlegung wert, readonlyanstatt disabledwie von Andrew unten erwähnt.
Andilabs
93

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.

Andrew
quelle
Großartig, nur eine Anmerkung: Die Schaltfläche "Senden" kann weiterhin schreibgeschützt werden.
André Chalella
3
deaktiviert verhindert Serialisierung, aber schreibgeschützt verhindert Validierung
Jeff Lowery
11

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);
Krzysiek
quelle
Beste Lösung, funktioniert für Auswahl, Kontrollkästchen, Radio, versteckte und deaktivierte Eingänge
Plasebo
9

@ 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();
Aaron Hudon
quelle
4

Versuche dies:

<input type="checkbox" name="_key" value="value"  disabled="" />
<input type="hidden" name="key" value="value"/>
KennyKam
quelle
Könnten Sie bitte etwas näher darauf eingehen und dem OP erklären, warum dies funktioniert?
Willem Mulder
Ich kann es dir erklären. Wenn Sie immer noch ein deaktiviertes Eingabefeld haben möchten (aus welchem ​​Grund auch immer), aber Sie möchten auch den Eingabenamen mit der serialize () -Methode senden. Dann können Sie stattdessen ein verstecktes Eingabefeld verwenden (mit demselben Wert wie Ihr deaktiviertes Eingabefeld), das serialize () nicht ignoriert. Und dann können Sie auch Ihr deaktiviertes Eingabefeld für die Sichtbarkeit behalten.
Superkytoz
3

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);
    }
});
David162795
quelle
2

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.

Jason Lewis
quelle
1

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");
Maximran
quelle
1
Ich habe Ihre Funktion ausprobiert und sie erzeugt weder den Namen noch den Wert der Elemente. Siehe Beispiel unten; code 3: {name: undefined, value: ""} 4: {name: undefined, value: ""}
blackmambo
0

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")
Carl Verret
quelle