2011-01-20 19 views
104

Parece que los elementos de entrada deshabilitados por defecto son ignorados por $.serialize(),

¿hay un problema?

+0

Es aún más extraño, porque puede serializar un 'textarea' deshabilitado pero no una 'entrada' deshabilitada ... – daVe

Respuesta

178

Habilítelos temporalmente.

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

que vale la pena considerar' readonly' en lugar de 'disabled' como lo menciona Andrew a continuación. – andi

+9

@andi readonly no funciona para las selecciones – Marc

0

Los elementos de entrada deshabilitados no se serializan porque 'deshabilitado' significa que no se deben usar, según el estándar W3C. jQuery simplemente está cumpliendo con el estándar, aunque algunos navegadores no lo hacen. Puede solucionar este problema, mediante la adición de un campo oculto con un valor igual al campo de discapacitados, o al hacer esto a través de jQuery, algo como esto:

$('#myform').submit(function() { 
    $(this).children('input[hiddeninputname]').val($(this).children('input:disabled').val()); 
    $.post($(this).attr('url'), $(this).serialize, null, 'html'); 
}); 

Obviamente, si tuviera más de una entrada desactivada, Tendría que iterar sobre selectores coincidentes, etc.

78

¿Qué ocurre con el uso de entradas de solo lectura en lugar de entradas deshabilitadas?

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

Esto debería ser recogido por serialize().

+9

no funciona para las casillas de verificación – Highstrike

+8

no funciona para los cuadros combinados también. – wmac

+0

Genial, solo una nota: el botón de enviar todavía se puede hacer clic cuando se lee solo. –

5

Puede utilizar la función de proxy (afectan tanto a $.serializeArray() y $.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

probar esto

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

¿Podría explicar un poco más y explicar al OP por qué funciona? –

+0

Puedo explicártelo por ti. Si aún desea tener un campo de entrada deshabilitado (por el motivo que sea), pero también desea enviar el nombre de la entrada con el método serialize(). Entonces, en su lugar, puede usar un campo de entrada oculto (con el mismo valor que su campo de entrada deshabilitado), que serialize() no ignora. Y luego también puede mantener su campo de entrada deshabilitado para la visibilidad. – superkytoz

0

puedo ver algunas soluciones, pero todavía nadie sugirió escribir su propia serialización ¿función? Aquí van: 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 proporcionan la respuesta núcleo, mi contribución aquí es sólo una sutileza jQuery mediante la adición de una función a la misma.

/** 
* 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; 
}; 

Ejemplo de uso:

$("form").serializeIncludeDisabled(); 
0

Considere utilizar readonly en lugar de disabled. Los campos de solo lectura están serializados.

Cuestiones relacionadas