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 .