Estive olhando os documentos do jQuery e acho que podemos fazer isso em uma linha usando seletores :
$("#myForm :input[value!='']").serialize() // does the job!
Obviamente #myForm obtém o elemento com id "myForm", mas o que era menos óbvio para mim no início foi que o caractere de espaço é necessário entre #myForm e: input, pois é o operador descendente .
: entrada corresponde a todos os elementos de entrada, área de texto, seleção e botão.
[value! = ''] é um atributo diferente do filtro. O estranho (e útil) é que todos: tipos de elementos de entrada têm atributos de valor, até mesmo caixas de seleção e seleção, etc.
Finalmente, para remover também as entradas em que o valor era '.' (conforme mencionado na pergunta):
$("#myForm :input[value!=''][value!='.']").serialize()
Nesse caso, a justaposição, ou seja, colocar dois seletores de atributos próximos um do outro , implica um AND. Usar uma vírgula implica um OR. Desculpe se isso é óbvio para o pessoal do CSS!
[value]
corresponde a qualquer elemento com o atributovalue
presente , incluindo aqueles com valores vazios (ou nenhum). Isso se deve a um bug em versões anteriores do jQuery que criava uma inconsistência entre certas variações deinput[value]
e:input[value]
. Tome, por exemplo<input value="foo"><input value=""><input value><input>
,; o bug é ilustrado neste violino .