Sembra disattivato per impostazione predefinita gli elementi di input vengono ignorati da $.serialize()
,
c'è un problema?
Sembra disattivato per impostazione predefinita gli elementi di input vengono ignorati da $.serialize()
,
c'è un problema?
Abilitare 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');
Gli elementi di input disabilitati non vengono serializzati perché "disattivato" significa che non devono essere utilizzati, secondo lo standard W3C. jQuery è conforme allo standard, anche se alcuni browser non lo fanno. Si può ovviare a questo, con l'aggiunta di un campo nascosto con un valore identico al campo disabili, o in questo modo tramite jQuery, qualcosa di simile:
$('#myform').submit(function() {
$(this).children('input[hiddeninputname]').val($(this).children('input:disabled').val());
$.post($(this).attr('url'), $(this).serialize, null, 'html');
});
Ovviamente, se si ha più di un ingresso disabilitata, è Dovresti eseguire un'iterazione su selettori di corrispondenza, ecc.
Che ne dici di utilizzare gli input di sola lettura anziché gli input disabilitati?
<input name='hello_world' type='text' value='hello world' readonly />
Questo dovrebbe essere prelevato da serialize().
non funziona per le caselle di controllo – Highstrike
non funziona anche per le caselle combinate. – wmac
Grande, solo una nota: il pulsante di invio è ancora cliccabile quando è di sola lettura. –
È possibile utilizzare la funzione Proxied (colpire sia $.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);
provare questo
<input type="checkbox" name="_key" value="value" disabled="" />
<input type="hidden" name="key" value="value"/>
Potresti per favore approfondire un po 'e spiegare all'OP perché funziona? –
Posso spiegarlo per voi. 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 utilizzare un campo di input nascosto (con lo stesso valore del campo di input disabilitato), che serialize() non ignora. E poi puoi anche mantenere il campo di input disabilitato per la visibilità. – superkytoz
posso vedere un paio di soluzioni alternative, ma ancora nessuno ha suggerito scrivere la propria serializzazione funzione? Qui si va: 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);
}
});
@ user113716 fornito la risposta di base, il mio contributo qui è solo una finezza jQuery con l'aggiunta di 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 utilizzo:
$("form").serializeIncludeDisabled();
consideri di usare readonly
invece di disabled
. I campi di sola lettura sono serializzati.
È anche più strano, perché è possibile serializzare una 'textarea 'disabilitata ma non un' input' disabilitato .. – daVe