2011-08-14 19 views
6

Estoy tratando de escribir una función genérica que pueda usar con el complemento de validación de jquery que hará que un campo sea obligatorio en función del valor de otro campo. Esto es lo que quiero que suceda:Manera genérica de obtener el valor de una entrada independientemente del tipo

  • Si el valor del campo 1 se encuentra en una gama de valores especificada (actualmente probando con "No", "n/a", y "0"), o está vacía, no hacer nada . De lo contrario, haga que se requiera el campo 2.

Obtener el valor del campo 1 es el problema. No tuve problemas para resolver esto con una entrada de tipo texto o <select>, pero estoy intentando que funcione con radios y que tenga dificultades. He aquí un extracto de mi código:

var value = $('[name="option"]').val(), 
    empty = ['no', '', 'n/a', '0']; 

// If the input is not "empty", make the additional field required 
if ($.inArray(value.toLowerCase(), empty) < 0) { // returns -1 if not found 
    required = true; 
} else { 
    required = false; 
} 

Esto funciona para todo lo que necesito excepto las radios, ya que parece leer el valor del primer radio, independientemente de si se ha marcado o no.

El campo que activará el "requerida" bien será una de las diversas entradas de texto (text, url, email, etc.), un <select>, o un solo conjunto de elección de radios. Sin opción múltiple. Pasaré esta función como un parámetro al required en mi configuración de validación de jquery para cada campo al que deseo que se aplique. El atributo name del campo "otro" que se evalúa estará disponible para él.

Aquí está mi demo hasta ahora, un poco feo, pero hay notas: http://jsfiddle.net/uUdX2/3/

He intentado un montón de diferentes maneras usando is(':checked') y el selector :checked, pero todos ellos han fracasado. Los eliminé de la demostración porque no funcionaron.

¿Qué necesito para que esto funcione con las radios y de tipo texto o entradas de selección, sin saber qué tipo de entrada será?

Respuesta

8

probar este

var value = $('[name="option"]'); 
var type = value.attr("type"); 

if(type && type.toLowerCase() == 'radio') 
    value = value.filter(":checked").val(); 
else 
    value = value.val(); 

Trabajando demo

+0

No estoy seguro de por qué no pensé en esto yo mismo, esto funciona a la perfección. Creo que esto también debería funcionar para entradas de opción múltiple si lo necesito. A veces solo necesitamos otro par de ojos después de un largo día. Muchas gracias. –

+0

Me alegro de que te haya ayudado, gracias. – ShankarSangoli

1

Algo como esto:

var value = $('[type="radio"][name="option"]:checked, [type!="radio"][name="option"]', form).val() || '0' 

bastante similar al de Shankar, pero lo hace todo en el selector.

http://jsfiddle.net/infernalbadger/uUdX2/8/

No está funcionando cuando no hay nada seleccionado. ¿No está seguro de lo que quiere que haga cuando eso suceda?

+0

Intenté algo similar y no pude hacerlo funcionar, pero esta parece ser otra buena forma de hacerlo (probablemente pueda descubrir el pequeño error). Me gusta este método porque usa un selector (tipo de). EDITAR: Dejé una nota en la demostración sobre lo que debería suceder si no se marca nada: "Si se marca" No "o no se marca nada, no se debería requerir campo adicional." Perdón por no aclarar en mi publicación. –

+0

He solucionado el pequeño error añadiendo el '|| '0' 'al final de la línea de valor. De esta forma, si no encuentra un valor, por defecto es 0, que luego mostrará el mensaje. –

+0

Funciona muy bien, ojalá pudiera aceptar ambas respuestas. Estoy usando el otro método por ahora, pero no tengo reparos en cambiar las respuestas aceptadas si termino usando tu método. Realmente lo aprecio, Richard. ¡Sin embargo, el método de ShankarSangoli realmente me hizo enfrentar las palmas! (como en: ¿Por qué no pensé en esto ??) –

Cuestiones relacionadas