Melhorando a interação em formulários de busca

Melhorar a interação do campo de busca de um site permite que as pessoas que usam tal formulário para buscar tenham uma melhor experiência de uso (leia-se: usabilidade). Com pequenos detalhes, um pouquinho de bom-senso e algumas poucas linhas de jQuery, é possível promover efeitos interessante no campo de busca.
Para ficar claro, será abordada a seguinte interação:
- Campo de busca é “populado” com um termo pré-definido;
- Quando o campo recebe o foco, caso tenha o termo pré-definido, é limpo para a pessoa escrever o que pretende;
- Quando o campo perde o foco, se o conteúdo for o mesmo do termo pré-definido (ou em branco), este termo reaparece;
- Quando o botão é pressionado, caso o valor seja termo pré-definido ou esteja em branco, o form não submete e o foco passa ao campo apropriado.
O formulário de busca
Um exemplo de um formulário simples de busca, que pode ser usado em “sites reais”, profissionalmente, pode ser do tipo:
<form method="get" action="script.php" name="form" id="form"> <input type="text" id="form-input" name="form-input" value="Snippets ou Scripts" /> <input type="submit" id="form-submit" name="form-submit" value="Buscar" /> </form>
Termo pré-definido
A expressão “termo pré-definido” é mais adequada, já que cada site pede um “label” de indicação diferente, conforme as especificações e necessidades deste. Algumas pessoas preferem o termo “Buscar” ou “Procurar” com um botão de label “OK” ou “Vai”; já alguns sites preferem explicitar a função da busca com algo do tipo “Produtos ou Serviços”, acompanhado de um botão com o label “Buscar” (o que é uma abordagem bem interessante).
De uma maneira ou de outra, é preciso definir que termo será esse. Para nosso exemplo, vamos supor que seja um site voltado a desenvolvimento web e o termo pré-definido será “Snippets ou Scripts“. Vamos criar uma expressão regular simples com uma parte do termo pré definido:
patt = new RegExp('Snippets ou');
E por que não colocar a expressão inteira? Também poderia ser feito, mas o “esforço” para identificar o padrão aumenta em relação ao tamanho/complexidade da mesma. Sinta-se à vontade para fazer vários testes.
Melhorando a interação do formulário de busca
A melhora da interação se de duas formas:
- Interção com o campo;
- Interação com o botão;
Interação com o campo
Segundo o planejamento, o que se pretende é “Quando o campo recebe o foco, caso tenha o termo pré-definido, é limpo para a pessoa escrever o que pretende”. A lógica é testar a expressão regular: caso o teste seja positivo, o campo é limpo e recebe o foco para a pessoa escrever. Ao perder o foco, “se o conteúdo for o mesmo do termo pré-definido (ou em branco), este termo reaparece”.
$('#form-input') .focus(function(){ if (patt.test($(this).val())) { $(this).val(''); } }) .blur(function(){ if ($(this).val() == '') { $(this).val('Snippets ou Scripts'); } });
Interação com o botão
A interação com o botão também é importante – e, infelizmente, é um ponto esquecido por muitos desenvolvedores. A ideia é, ao se clicar no botão, testar se a expressão “bate” ou o campo está em branco e, caso seja um desses casos, dar o foco no campo.
$('#form-submit').click(function(){ if ((patt.test($('#form-input').val())) || ($('#form-input').val() == '')) { $('#busca-bottom').focus(); return false; // Impede que o form seja submetido } });
Não é necessário dar a instrução de limpar o campo no foco porque a peça de script anterior, sobre a interação com o campo, já faz isso.
JavaScript final
Juntando os pedaços de códigos, já devidamente explicados, tem-se o seguinte:
$('#form-input') .focus(function(){ if (patt.test($(this).val())) { $(this).val(''); } }) .blur(function(){ if ($(this).val() == '') { $(this).val('Snippets ou Scripts'); } }); $('#form-submit').click(function(){ if ((patt.test($('#form-input').val())) || ($('#form-input').val() == '')) { $('#busca-bottom').focus(); return false; // Impede que o form seja submetido } });
Conclusão sobre a melhora da interação em formulários de busca
Certamente essas não são as únicas melhorias cabíveis para a melhoria de usabilidade e interação de um formulário de busca simples, mas, certamente, são 2 medidas muito bem-vindas para que a experiência e “agradabilidade” sejam melhoradas.
Poderia haver, por exemplo, uma tooltip com o que se pode encontrar no site e/ou fornecendo algum exemplo de termo; implementar uma solução de autocomplete; ou, ao invés de limpar o campo, apenas selecionar todo o termo para, já digitação, substituí-lo pelo o que está sendo digitado. Depende da necessidade do projeto.
E você, tem alguma dica ou solução interessante para melhorar a interação em formulários de busca?
Boa dica esta que voce postou estava a procura desta informaçao, parabens.
Muito bom o tutorial ( :
agora com o HTML 5 este pré definido ficou mais fácil de ser colocado
basta adicionar o atributo [ placeholder=O que deseja pré definir ] que ele funciona :) claro que isso em navegadores que dão suporte :X
A jQuery é uma "mão na roda" mesmo.
Tenho usado ela na maioria dos projetos. Está virando quase um padrão. É praticamente um plugin, só que carrega na hora.
Sugestões
Dar um "trim" ou algo para eliminar os espaços em branco antes e depois da string e não deixar o form submeter se só houver espaço em branco. Também para quando só há um caracter.
Ter um "autocomplete" é o ideal. Usando, por exemplo, os termos mais buscados, as suas tags, suas categorias, e alguns termos pré-definidos que mostrem algum conteúdo.
É muito chato fazer uma busca e retornar somente "conteúdo não encontrado".
Muitas vezes isto acontece mesmo quando o conteúdo existe. Ou quando se usa as próprias opções de combos e radioButtons oferecidas na hora da busca. É uma lástima.
- – - – - – -
Só a título de curiosidade:
Pra quem não está usando a jQuery no seu projeto, não precisa carregar 72KB só para fazer isto.
Dá pra criar uma função javascript simples, ou até usar funções dentro das ações dos próprios elementos do form.
Dentro do contexto deste exemplo, faz a mesma coisa.
na tag form
- testa a variável antes de enviar, e retorna o foco ao campo, caso seja inválida
<code>
onsubmit="if(document.forms[0].senha.value=='Snippets ou Scripts' || document.forms[0].senha.value==''){document.forms[0].senha.focus();return false;}"
</code>
no input type="text"
- apaga o termo padrão quando em foco, e se estiver em branco, retorna o termo quando em "blur"
<code>
value="Snippets ou Scripts" onfocus="if(document.forms[0].senha.value=='Snippets ou Scripts'){document.forms[0].senha.value='';}" onblur="if(document.forms[0].senha.value==''){document.forms[0].senha.value='Snippets ou Scripts';}"
</code>
Obs.: Não sei programar em javascript. Pode ter algo mais simples ou algo mais "correto" a fazer
@ otimizar site
Obrigado e apareça!
@ Anderson
Exatamente. E, enquanto o HTML5 não é uma "W3C oficial", o plugin jQuery.html5form pode ser bem útil!
@Acelio
Concordo que, para projetos mais simples/menores, não há necessidade de usar a jQuery. Dependendo, usar somente o Sizzle já resolve.