2009-05-11 22 views
16

Tengo una forma bastante compleja que proporciona validación y retroalimentación en tiempo real al usuario que la usa a medida que ingresa los datos. Partes del formulario pueden ser deshabilitadas debido a la forma de "lógica comercial" de las entradas, pero el lado del servidor necesita saber el valor de estas entradas deshabilitadas para hacer algunas de sus comprobaciones en las solicitudes AJAX.¿Cuál es la mejor manera de enviar entradas deshabilitadas como parte de una solicitud JQuery AJAX?

Estaba usando JQuery para serializar todo el formulario $ (form) .serialize() y enviar todos estos datos al servidor durante mis solicitudes AJAX, pero a esta información serializada le faltarán las entradas que estén deshabilitadas. Entonces, ¿cuál es la mejor manera de incluir todos los datos del formulario (incluso las entradas deshabilitadas) con cada solicitud AJAX?

Mi idea actual es adjuntar una función a ajaxStart (devolución de llamada) que crearía un hash-map del lado del cliente de todas las entradas, inhabilitará atributos, habilitará todas las entradas, serializará y luego volverá a establecer el atributo deshabilitado de cada formulario su valor original Pero esto parece demasiado complejo y quería algo más simple que no fuera tan frágil.

+0

Hmm ... ¿es obligatorio marcarlos como deshabilitados? Establecerlos como de solo lectura no funcionará en absoluto? – Powerlord

+0

No creo que el atributo de solo lectura funcione en listas de selección. –

+0

@Hannele esta pregunta fue hecha en 2009, la otra en 2011, ¿cómo es esto una tontería de eso? – mido

Respuesta

22

trate de hacer algo como esto para serializar el formulario:

$(function() { 
     $('input[type=button]').click(function() { 
      var form = $('form').serialize(); 
      $('input[disabled]').each(function() { 
       form = form + '&' + $(this).attr('name') + '=' + $(this).val(); 
      }); 

     }); 
    }); 

HTML Prueba

<form action="/action"> 
    <input type='text' disabled='disabled' value='hey' id='hey' name='hey' /> 
    <input type='text' value='ho' id='ho' name='ho' /> 
    <input type='text' value="hi" id='hi' name='hi' /> 
    <input type='button' value="Serialize" /> 
</form> 

salida

ho=ho&hi=hi&hey=hey 
+1

Si no hay otros campos, entonces deshabilitó esto'form = form + '&' + this.id + '=' + $ (this) .val (); 'te dará una cadena en forma' & arg = val & arg2 = val2 & .. ', lo cual no es muy agradable. Primero debe verificar si el formulario no está vacío. – gruszczy

+0

@gruszczy - buen punto. Si, después de que el formulario se haya serializado, 'form' está vacío, puede agregar' form = & dummy = nothing'. Es un caso bastante raro, así que dejaré la muestra del código como está. – tvanfosson

+4

Parece que esto fallaría si los valores contienen '&'. – Zarel

5

Si el servidor acepta JSON, puede crear un objeto JSON con jQuery (use jQuery select statements para incluir las etiquetas de entrada necesarias), luego envíelo al servidor r como objeto - más información aquí: http://encosia.com/2009/04/07/using-complex-types-to-make-calling-services-less-complex/.

Básicamente, hacer algo como esto:

var formInputs = { }; 

$('input[type=text]').each(function() { 
    formInputs[this.id] = this.value; 
}); 
1

Bueno Otra opción es simplemente añadir un campo oculto con el valor que wa no ha publicado en el servidor.

Recuerde utilizar un diferente (ficticio) id para la etiqueta que deshabilite para evitar cualquier conflicto.

5

partes del formulario pueden desactivarse debido a la forma "lógica de negocio" de las entradas

Puede utilizar el atributo "sólo lectura" para desactivar los campos de entrada. Hacer así:

<input type="text" readOnly="readOnly" /> 

El atributo de sólo lectura especifica que un campo de entrada debe ser de sólo lectura. Un campo de solo lectura no se puede modificar. Sin embargo, un usuario puede tabularlo, resaltarlo y copiar el texto de él.

de: campo HTML input readonly Attribute

Una de sólo lectura también puede ser sometida a servidor como cadena de consulta.

+2

Esto parece funcionar bien en etiquetas de entrada verdadera, pero no en listas de selección . –

1

para enviar el valor deshabilitado al servidor mediante.serilize() mediante el envío de formulario usando jquery a ajax es

<HTML> 
<HEAD> 
<script> 
$(document).ready(function(){ 
$("#submid").click(function() { // loginForm is submitted 
$('#ayyappa').removeAttr('disabled'); 
$.ajax({ 
url: "urls", 
data:{ 
"sel_opt":$("#ayyappa").attr("value"), 
} 

}); // ajax 
$("#Number").attr("disabled", "disabled"); 
});//click 
}); 


</script> 

</HEAD> 

<BODY><input type='text' id="ayyappa" name='ayyappa' value="ayyappa" disabled> 

</BODY> 
</HTML> 
Cuestiones relacionadas