2011-01-20 10 views
104

Sembra disattivato per impostazione predefinita gli elementi di input vengono ignorati da $.serialize(),

c'è un problema?

+0

È anche più strano, perché è possibile serializzare una 'textarea 'disabilitata ma non un' input' disabilitato .. – daVe

risposta

178

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

vale la pena considerare 'readonly' invece di' disabled' come menzionato da Andrew in basso. – andi

+9

@andi readonly non funziona per selezionare – Marc

0

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.

78

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().

+9

non funziona per le caselle di controllo – Highstrike

+8

non funziona anche per le caselle combinate. – wmac

+0

Grande, solo una nota: il pulsante di invio è ancora cliccabile quando è di sola lettura. –

5

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

provare questo

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

Potresti per favore approfondire un po 'e spiegare all'OP perché funziona? –

+0

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

0

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

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

consideri di usare readonly invece di disabled. I campi di sola lettura sono serializzati.

Problemi correlati