Criando um plugin jQuery – parte 2 – Codificando
Opa! para não perdermos o foco, vamos manter em mente a situação inicial:
Problema:
“Possuo campos input em um formulário, onde dentro deles existe uma descrição do que o usuario deve digitar ali.
Gostaria que quando o usuário entrasse nesse campo(clicasse, tentasse preencher..), esse valor default fosse apagado.
Porém, se o usuário sair deste campo, sem escrever nada, esse valor ‘default’, deve voltar a aparecer. Sendo que se ele preencher, fique lá o que ele digitou.“
Começamos, criando a estrutura, agora vamos codificar, para “resolver mesmo” o problema.
“Gostaria que quando o usuário entrasse nesse campo(clicasse, tentasse preencher..), esse valor default fosse apagado.“
Como estamos programando numa linguagem client-side, ‘orientada a eventos’, precisamos identificar qual evento vamos usar.
O trecho:
quando o usuário entrasse nesse campo
, significa para nós e para o javascript, o evento onFocus
E o trecho
esse valor default fosse apagado
significa para o javascript: atribuir um VAZIO para o atributo .value do input.
Logo, em código, isso é:
$("input[name='telefone']").focus(function(){
$( this ).val( '' );
});
Não precisamos de muito, e já resolvemos a primeira parte. Bastou entender o que tínhamos que fazer, organizar de forma lógica, e ir fazendo.
Continuando:
se o usuário sair deste campo
. De novo, precisamos identificar o evento, agora estamos falando do onBlur.
sem escrever nada
, significa testarmos o atributo .value do nosso objeto input, e vermos se tem algo ou não lá. Em sintaxe jQuery, possuimos o método .val(), para acessar esse atributo HTML do input.
esse valor ‘default’, deve voltar a aparecer
, significa, atribuirmos novamente aquela mensagem ao nosso value.
$("input[name='telefone']").blur(function(){
if( $( this ).val() == '' )
$( this ).val( 'Digite seu telefone' );
});
Hora de testar oque já fizemos (tudo junto):
<script type="text/javascript"> type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
/* para o input telefone */
$("input[name='telefone']").focus(function(){
$( this ).val( '' );
});
$("input[name='telefone']").blur(function(){
if( $( this ).val() == '' )
$( this ).val( 'Digite seu telefone' );
});
});
</script>
<input type="text" name="telefone" value="Digite seu telefone" />
<input type="text" name="email" value="Digite seu e-mail" />
Bacana, aparentemente, estaria tudo pronto.
Mas daí notamos um bug!
Vamos ao fluxo:
_O cara vê o input, tem algo escrito lá. OK
Ele clica no input para escrever, nesse momento o que estava lá some. OK
Ele escreve algo e sai do input, oque ele escreveu permanecesse. OK
Ele clica novamente no input [e aqui acontece o bug], e oque ele tinha escrito some! BUG_
Essa última interação não estava prevista, e é por isso que precisamos testar os script enqnto estamos desenvolvendo.
Esse bug nos revela, que estamos apagando o conteudo do input, sem nos importar com oque estava escrito alí. Enquanto que isso só deveria ocorrer, se oque estivesse alí, fosse a nossa mensagem default. (afinal queremos que o usuário possa digitar e alterar oque ele quiser, mas não que ele envie nossa mensagem default para a gente).
Outro simples IF, e resolvemos esse ‘bug’:
$("input[name='telefone']").focus(function(){
//só vai apagar se for igual a mensagem default
if( $( this ).val()=='Digite seu telefone' )
$( this ).val( '' );
});
Parabéns, tecnicamente, resolvemos o problema. Do início ao fim.
Só que se precisarmos aplicar essa mesma rotina em outro campo:
<script type="text/javascript"> type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
/* para o input telefone */
$("input[name='telefone']").focus(function(){
if( $( this ).val()=='Digite seu telefone' )
$( this ).val( '' );
});
$("input[name='telefone']").blur(function(){
if( $( this ).val() == '' )
$( this ).val( 'Digite seu telefone' );
});
/* para o input email */
$("input[name='email']").focus(function(){
if( $( this ).val()=='Digite seu e-mail' )
$( this ).val( '' );
});
$("input[name='email']").blur(function(){
if( $( this ).val() == '' )
$( this ).val( 'Digite seu e-mail' );
});
});
</script>
<input type="text" name="telefone" value="Digite seu telefone" />
<input type="text" name="email" value="Digite seu e-mail" />
Ou seja, tivemos que duplicar código !! O que é um absurdo, e devemos evitar fazer!
No próximo post, vamos ver como otimizar essa rotina, para então, melhorar ainda mais e evoluir para a criação do plugin.
Veja que primeiro identifiquei o problema, resolvi a situação, e só então incrementei e parti para ‘o nível avançado’.