Come posso fare in modo che $ .serialize () tenga conto di quelli disabilitati: elementi di input?


135

Sembra che per impostazione predefinita gli elementi di input disabilitati siano ignorati $.serialize(). C'è una soluzione?


È ancora più strano, perché puoi serializzare un disabilitato textareama non un disabilitato input..
daVe

Risposte:


233

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');

26
vale la pena considerare readonlyinvece di disabledcome menzionato da Andrew di seguito.
andilabs

93

Usa input di sola lettura anziché input disabilitati:

<input name='hello_world' type='text' value='hello world' readonly />

Questo dovrebbe essere raccolto da serialize ().


Ottimo, solo una nota: il pulsante di invio è ancora selezionabile in sola lettura.
André Chalella,

3
disabilitato impedisce la serializzazione, ma impedisce solo la convalida
Jeff Lowery

12

È 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);

La migliore soluzione, funziona con input selezionati, checkbox, radio, nascosti e disabilitati
Plasebo

9

@ 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();

4

Prova questo:

<input type="checkbox" name="_key" value="value"  disabled="" />
<input type="hidden" name="key" value="value"/>

Potresti per favore elaborare un po 'di più e spiegare all'OP perché questo funziona?
Willem Mulder,

Posso spiegarlo per te. Se vuoi ancora avere un campo di input disabilitato (per qualsiasi motivo), ma vuoi anche inviare il nome di input con il metodo serialize (). Quindi invece puoi usare un campo di input nascosto (con lo stesso valore del tuo campo di input disabilitato), che serialize () non ignora. E poi puoi anche mantenere il tuo campo di input disabilitato per la visibilità.
superkytoz,

3

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);
    }
});

2

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.


1

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");

1
Ho provato la tua funzione e non produce il nome o il valore degli elementi. Vedi esempio sotto; code 3: {nome: undefined, valore: ""} 4: {nome: undefined, valore: ""}
blackmambo

0

Appena sopra Aaron Hudon:

Forse hai qualcos'altro oltre a Input (come select), quindi ho cambiato

this.find(":input:disabled")

per

this.find(":disabled")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.