He estado revisando los documentos de jQuery y creo que podemos hacer esto en una línea usando selectores :
$("#myForm :input[value!='']").serialize() // does the job!
Obviamente, #myForm obtiene el elemento con id "myForm", pero lo que fue menos obvio para mí al principio fue que el carácter de espacio es necesario entre #myForm y: input ya que es el operador descendiente .
: input coincide con todos los elementos input, textarea, select y button.
[value! = ''] es un atributo que no es igual al filtro. Lo extraño (y útil) es que todos: los tipos de elementos de entrada tienen atributos de valor, incluso selecciones y casillas de verificación, etc.
Finalmente para eliminar también las entradas donde el valor era '.' (como se menciona en la pregunta):
$("#myForm :input[value!=''][value!='.']").serialize()
En este caso, la yuxtaposición, es decir, colocar dos selectores de atributos uno al lado del otro , implica un AND. Usar una coma implica un OR. Lo siento si eso es obvio para la gente de CSS.
[value]
coincide con cualquier elemento con el atributovalue
presente , incluidos aquellos con valores vacíos (o sin valores). Esto se debe a un error en versiones anteriores de jQuery que creaba una inconsistencia entre ciertas variaciones deinput[value]
y:input[value]
. Tomemos, por ejemplo<input value="foo"><input value=""><input value><input>
,; el error se ilustra en este violín .$form.find(":input[value]")
- los campos vacíos no fueron seleccionados. Esto no funcionó:$form.find(":input[value!='']")
- se seleccionaron todos los campos. Espero que ayude a alguien. (jQuery 2.0.0)$form.find(":input[value]")
también funcionó para mí (jQuery 1.11.0)value
atributo ya estaba allí. No lo reconoció de otra manera.value
se establece mediante programación, esto no funcionará (value
no existirá como un atributo HTML, pero sí como un atributo de datos en la entrada). En esos casos, intente lo siguiente:$('#myForm :input').filter(function(i) { return ($(this).val().length != 0); }).serialize()
. EDITAR: Acabo de ver la respuesta de Rich con el mismo efecto.No pude hacer que la solución de Tom funcionara (?), Pero pude hacer esto usando
.filter()
una función corta para identificar campos vacíos. Estoy usando jQuery 2.1.1.fuente
:input
selector básicamente selecciona todos los controles de formulario. Selecciona todos los elementos de entrada, área de texto, selección y botón". fuenteEsto funciona para mi:
fuente
!!
vuelve a escribir cualquier cosa a bool, puedes probar en la consola.!!('test')
,!!(5)
,!!(0)
input
selector, debería:input
incluir selecciones, etc.data = $( "#my_form :input").filter(function () { return $(this).val() != ""; }).serialize();
Podrías hacerlo con una expresión regular ...
Casos de prueba:
fuente
He usado la solución anterior, pero para mí no funcionaron. Entonces he usado el siguiente código
Puede ser útil para alguien
fuente
Miraría el código fuente de jQuery. En la última versión de la línea 3287.
Podría agregar las funciones "serialize2" y "serializeArray2". por supuesto, nómbrelos con algo mezquino.
O la mejor manera sería escribir algo para sacar las variables no utilizadas de serializedFormStr. ¿Alguna expresión regular que busca = & en la mitad de la cadena o termina en = ¿Algún asistente de expresiones regulares alrededor?
ACTUALIZACIÓN: Me gusta más la respuesta de rogeriopvl (+1) ... especialmente porque no puedo encontrar ninguna buena herramienta de expresiones regulares en este momento.
fuente
Una alternativa a la solución de Rich :
Explicaciones:
.submit()
se engancha alsubmit
evento del formularioe.preventDefault()
evita que el formulario se envíe.serializeArray()
nos da una representación de matriz de la cadena de consulta que se iba a enviar..filter()
elimina los valores falsos (incluidos los vacíos) en esa matriz.$.param(query)
crea una representación serializada y compatible con URL de nuestra matriz actualizadawindow.location.href
enviar la solicitudfuente
En coffeescript, haz esto:
fuente
Es posible que desee ver la función jquery .each (), que le permite iterar a través de cada elemento de un selector, de esta manera puede verificar cada campo de entrada y ver si está vacío o no y luego eliminarlo del formulario usando element.remove (). Después de eso, puede serializar el formulario.
fuente