Eu tenho um formulário de pesquisa com várias entradas de texto e listas suspensas que enviam por meio de um GET. Eu gostaria de ter um url de pesquisa mais limpo, removendo os campos vazios da string de consulta quando uma pesquisa é realizada.
var form = $("form");
var serializedFormStr = form.serialize();
// I'd like to remove inputs where value is '' or '.' here
window.location.href = '/search?' + serializedFormStr
Alguma ideia de como posso fazer isso usando jQuery?
fonte
[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 .$form.find(":input[value]")
- campos vazios não foram selecionados. Isso não funcionou:$form.find(":input[value!='']")
- todos os campos foram selecionados. Espero que ajude alguém. (jQuery 2.0.0)$form.find(":input[value]")
também funcionou para mim (jQuery 1.11.0)value
atributo já estava lá. Não o reconheceu de outra forma.value
for definido programaticamente, isso não funcionará (value
não existirá como um atributo HTML, mas como um atributo de dados na entrada). Nesses casos, tente o seguinte:$('#myForm :input').filter(function(i) { return ($(this).val().length != 0); }).serialize()
. EDIT: Acabei de ver a resposta de Rich para o mesmo efeito.Não consegui fazer a solução de Tom funcionar (?), Mas consegui fazer isso usando
.filter()
uma função curta para identificar campos vazios. Estou usando o jQuery 2.1.1.fonte
:input
seletor basicamente seleciona todos os controles de formulário. Seleciona todos os elementos de entrada, área de texto, seleção e botão." fonteIsso funciona para mim:
fonte
!!
redigitar qualquer coisa para bool, você pode tentar no console.!!('test')
,!!(5)
,!!(0)
input
seletor, deve haver:input
para incluirdata = $( "#my_form :input").filter(function () { return $(this).val() != ""; }).serialize();
Você poderia fazer isso com um regex ...
Casos de teste:
fonte
Eu usei a solução acima, mas para mim não funcionou. Usei o seguinte código
Pode ser útil para alguém
fonte
Gostaria de olhar para o código-fonte do jQuery. Na última versão da linha 3287.
Posso adicionar as funções "serialize2" e "serializeArray2". é claro que nomeie-os como algo significativo.
Ou a melhor maneira seria escrever algo para extrair os vars não utilizados de serializedFormStr. Alguma regex que procura = & no meio da string ou terminando em = Algum assistente de regex por aí?
ATUALIZAÇÃO: Eu gosto mais da resposta de rogeriopvl (+1) ... especialmente porque não consigo encontrar nenhuma boa ferramenta de regex no momento.
fonte
Uma alternativa para a solução de Rich :
Explicações:
.submit()
conecta-se aosubmit
evento do formulárioe.preventDefault()
impede que o formulário seja enviado.serializeArray()
nos dá uma representação de array da string de consulta que seria enviada..filter()
remove valores falsos (incluindo vazios) nessa matriz.$.param(query)
cria uma representação serializada e compatível com URL de nossa matriz atualizadawindow.location.href
enviar a solicitaçãofonte
No coffeescript, faça o seguinte:
fonte
Você pode querer olhar para a função .each () jquery, que permite iterar por cada elemento de um seletor, dessa forma, você pode verificar cada campo de entrada e ver se está vazio ou não e depois removê-lo do formulário usando element.remove (). Depois disso, você pode serializar o formulário.
fonte