Como faço para que uma caixa de texto HTML mostre uma dica quando vazia?

210

Quero que a caixa de pesquisa na minha página da Web exiba a palavra "Pesquisar" em itálico cinza. Quando a caixa recebe o foco, ela deve se parecer com uma caixa de texto vazia. Se já houver texto nele, ele deverá ser exibido normalmente (preto, sem itálico). Isso me ajudará a evitar confusão ao remover o rótulo.

BTW, esta é uma pesquisa Ajax na página , por isso não possui botão.

Michael L Perry
fonte
4
desde que a pergunta foi feita, o atributo de marcador de posição HTML5 tornou-se compatível com todos os navegadores.
Jasen
Olá Michael. Você gostaria de alterar a resposta aceita nesta página? Parece haver um vencedor claro, diferente da resposta aceita.
null,
O problema com uma solução JavaScript é que nem todos têm o JavaScript ativado. O espaço reservado não desaparece quando a caixa de texto fica em foco se você estiver usando um plug-in de navegador como o NoScript (muito útil para os desenvolvedores terem instalado). A opção Placeholder é a solução mais robusta.
Sablefoste 22/03

Respostas:

365

Outra opção, se você está feliz por ter esse recurso apenas para navegadores mais recentes, é usar o suporte oferecido pelo atributo de espaço reservado do HTML 5 :

<input name="email" placeholder="Email Address">

Na ausência de estilos, no Chrome isso se parece com:

insira a descrição da imagem aqui

Você pode experimentar demos aqui e no HTML5 Placeholder Styling with CSS .

Certifique-se de verificar a compatibilidade do navegador desse recurso . Suporte no Firefox foi adicionado na versão 3.7. Chrome está bem. O Internet Explorer adicionou suporte apenas em 10. Se você segmentar um navegador que não suporta espaços reservados de entrada, poderá usar um plug-in jQuery chamado jQuery HTML5 Placeholder e, em seguida, basta adicionar o seguinte código JavaScript para habilitá-lo.

$('input[placeholder], textarea[placeholder]').placeholder();
Drew Noakes
fonte
@Duke, funciona em Fx3.7 +, (Safari / Chrome) e Opera. O IE9 não suporta, então acho que o IE8 também não.
Alessandro Vermeulen
Sim, acabei de descobrir hoje que o FF3.6 não o suporta.
Drew Noakes
Eu acho que mudou de novo. Encontrei-o aqui: github.com/mathiasbynens/jquery-placeholder
jocull
Advertência ao desenvolvedor "O Internet Explorer 10 e 11 não mostram o espaço reservado quando o campo está focado, mesmo que esteja vazio."
Coronel Panic
92

Isso é conhecido como marca d'água da caixa de texto e é feito via JavaScript.

ou se você usa jQuery, uma abordagem muito melhor:

naspinski
fonte
4
Esse segundo link está quebrado. Isso pode ser semelhante: digitalbush.com/projects/watermark-input-plugin
Michael Haren
14
Encontrei outra abordagem jQuery. este projeto está hospedado @ code.google.com/p/jquery-watermark
JP Hellemons
4
O plug-in digitalbrush salva a 'marca d'água' no banco de dados. Está na versão beta e não é atualizado desde 2007. Recomendo o uso do code.google.com/p/jquery-watermark, como o @JP sugeriu.
Kimball Robinson
1
acho que o autor da pergunta deve voltar e marcar o comentário do @JP como a melhor resposta.
Randy L
2
O plugin de marca d'água do jQuery é bastante noob porque não lida com o caso em que a entrada é igual ao valor pré-preenchido. Nesse caso, o texto de entrada fica cinza novamente!
atp
41

Você pode definir o espaço reservado usando o placeholderatributo em HTML ( suporte ao navegador ). O font-stylee colorpode ser alterado com CSS (embora o suporte ao navegador seja limitado).

input[type=search]::-webkit-input-placeholder { /* Safari, Chrome(, Opera?) */
 color:gray;
 font-style:italic;
}
input[type=search]:-moz-placeholder { /* Firefox 18- */
 color:gray;
 font-style:italic;
}
input[type=search]::-moz-placeholder { /* Firefox 19+ */
 color:gray;
 font-style:italic;
}
input[type=search]:-ms-input-placeholder { /* IE (10+?) */
 color:gray;
 font-style:italic;
}
<input placeholder="Search" type="search" name="q">

0b10011
fonte
Estava procurando por isso, ta - informações adicionais diveintohtml5.org/forms.html#placeholder
David Yell
2
Agora, essa deve ser a resposta aceita. O atributo placeholder pode não ter amplo suporte quando foi publicado originalmente em 2010, mas agora é suportado por todos os navegadores atuais, exceto o IE8.
precisa saber é
20

Você pode adicionar e remover uma classe CSS especial e modificar o valor de entrada onfocus/ onblurcom JavaScript:

<input type="text" class="hint" value="Search..."
    onfocus="if (this.className=='hint') { this.className = ''; this.value = ''; }"
    onblur="if (this.value == '') { this.className = 'hint'; this.value = 'Search...'; }">

Em seguida, especifique uma classe de dica com o estilo desejado em seu CSS, por exemplo:

input.hint {
    color: grey;
}
levik
fonte
2
Eu postei uma resposta que faz a mesma coisa, mas de uma forma mais conveniente e fácil manutenção: stackoverflow.com/questions/108207/...
de Drew Noakes
6

A melhor maneira é conectar seus eventos JavaScript usando algum tipo de biblioteca JavaScript, como jQuery ou YUI, e colocar seu código em um arquivo .js externo.

Mas se você deseja uma solução rápida e suja, esta é sua solução HTML embutida:

<input type="text" id="textbox" value="Search"
    onclick="if(this.value=='Search'){this.value=''; this.style.color='#000'}" 
    onblur="if(this.value==''){this.value='Search'; this.style.color='#555'}" />

Atualizado : Adicionado o material de coloração solicitado.

Seb Nilsson
fonte
Isso é bom para pesquisas, mas em muitos casos você não deseja que marcas d'água sejam enviadas em nenhum evento de envio.
Kimball Robinson
@ k.robinson Eu marquei essa afirmação com +1. Este foi o código mais rápido e mais compacto naquele momento. Ele poderia ser resolvido de maneira mais refinada com um bloco de código javascript.
Seb Nilsson
4

Eu publiquei uma solução para isso no meu site há algum tempo. Para usá-lo, importe um único .jsarquivo:

<script type="text/javascript" src="/hint-textbox.js"></script>

Em seguida, anote as entradas que você deseja obter dicas com a classe CSS hintTextbox:

<input type="text" name="email" value="enter email" class="hintTextbox" />

Mais informações e exemplos estão disponíveis aqui .

Drew Noakes
fonte
1
Mas está quebrado. Se a entrada I o mesmo texto que foi a dica, ele se comporta como se nenhuma entrada foi dada (se guia I para dentro e, em seguida, fora dele novamente)
Stephan Eggermont
2
@ Stephan: Sim, essa é a única advertência que conheço. Você realmente achou isso um problema na prática? Nesse caso, talvez seja necessário investigar as camadas de uma div acima e exibi-la / ocultá-la. Esta é a solução mais simples que conheço. Eu também degrada muito bem se o JavaScript estiver desativado.
de Drew Noakes
Eu fui desencadeado pela configuração do valor. Eu tenho uma necessidade combinada de pré-enchimento com um valor existente ou padrão e uma pitada quando a caixa de texto está vazia
Stephan Eggermont
@ Stephan - Na verdade, me deparei com isso hoje e estou olhando para os plugins jQuery. Aquele vinculado na resposta aceita sofre o mesmo problema que o meu. Você conhece uma alternativa?
de Drew Noakes
3

Aqui está um exemplo funcional com o cache da biblioteca do Google Ajax e alguma mágica do jQuery.

Este seria o CSS:

<style type="text/stylesheet" media="screen">
    .inputblank { color:gray; }  /* Class to use for blank input */
</style>

Este seria o código JavaScript:

<script language="javascript"
        type="text/javascript"
        src="http://www.google.com/jsapi">
</script>
<script>
    // Load jQuery
    google.load("jquery", "1");

    google.setOnLoadCallback(function() {
        $("#search_form")
            .submit(function() {
                alert("Submitted. Value= " + $("input:first").val());
                return false;
        });

        $("#keywords")
            .focus(function() {
                if ($(this).val() == 'Search') {
                    $(this)
                    .removeClass('inputblank')
                    .val('');
                }
            })
            .blur(function() {
                if ($(this).val() == '') {
                    $(this)
                    .addClass('inputblank')
                    .val('Search');
                }
            });
    });
</script>

E este seria o HTML:

<form id="search_form">
    <fieldset>
        <legend>Search the site</legend>
            <label for="keywords">Keywords:</label>
        <input id="keywords" type="text" class="inputblank" value="Search"/>
    </fieldset>
</form>

Espero que seja o suficiente para fazer você se interessar pelos GAJAXLibs e pelo jQuery.

Gustavo Carreno
fonte
3

Agora ficou muito fácil. Em html, podemos atribuir o atributo placeholder para elementos de entrada .

por exemplo

<input type="text" name="fst_name" placeholder="First Name"/>

verifique para obter mais detalhes: http://www.w3schools.com/tags/att_input_placeholder.asp

apm
fonte
2

Eu achei o plugin jQuery jQuery Watermark melhor do que o listado na resposta superior. Por que melhor? Porque suporta campos de entrada de senha. Além disso, definir a cor da marca d'água (ou outros atributos) é tão fácil quanto criar uma .watermarkreferência no seu arquivo CSS.

Dustin
fonte
2

Isso é chamado de "marca d'água".

Encontrei o plugin jQuery marca d'água jQuery , que, diferentemente da primeira resposta, não requer configuração extra (a resposta original também precisa de uma chamada especial antes do envio do formulário).

elcuco
fonte
2

Use o Notificador de Formulário jQuery - é um dos plugins jQuery mais populares e não sofre com os bugs de algumas das outras sugestões do jQuery aqui (por exemplo, você pode estilizar livremente a marca d'água, sem se preocupar se ela será salva no base de dados).

O jQuery Watermark usa um único estilo CSS diretamente nos elementos do formulário (notei que as propriedades de tamanho de fonte CSS aplicadas à marca d'água também afetavam as caixas de texto - não o que eu queria). A vantagem do jQuery Watermark é que você pode arrastar e soltar texto nos campos (o jQuery Form Notifier não permite isso).

Outra sugestão sugerida por outras pessoas (a digitalbrush.com) enviará acidentalmente o valor da marca d'água para o seu formulário, por isso recomendo vivamente.

Kimball Robinson
fonte
1

Use uma imagem de plano de fundo para renderizar o texto:

 input.foo { }
 input.fooempty { background-image: url("blah.png"); }

Então tudo que você precisa fazer é detectar value == 0e aplicar a classe correta:

 <input class="foo fooempty" value="" type="text" name="bar" />

E o código JavaScript do jQuery se parece com o seguinte:

jQuery(function($)
{
    var target = $("input.foo");
    target.bind("change", function()
    {
        if( target.val().length > 1 )
        {
            target.addClass("fooempty");
        }
        else
        {
            target.removeClass("fooempty");
        }
    });
});
Kent Fredric
fonte
1

Você pode facilmente ler a caixa "Pesquisar" e, quando o foco for alterado, o texto será removido. Algo assim:

<input onfocus="this.value=''" type="text" value="Search" />

Obviamente, se você fizer isso, o próprio texto do usuário desaparecerá quando ele clicar. Então você provavelmente deseja usar algo mais robusto:

<input name="keyword_" type="text" size="25"  style="color:#999;" maxlength="128" id="keyword_"
onblur="this.value = this.value || this.defaultValue; this.style.color = '#999';"
onfocus="this.value=''; this.style.color = '#000';"
value="Search Term">
JH_
fonte
0

Quando a página é carregada pela primeira vez, faça com que a Pesquisa apareça na caixa de texto, colorida em cinza, se você desejar.

Quando a caixa de entrada receber foco, selecione todo o texto na caixa de pesquisa para que o usuário possa começar a digitar, o que excluirá o texto selecionado no processo. Isso também funcionará bem se o usuário desejar usar a caixa de pesquisa uma segunda vez, pois não precisará destacar manualmente o texto anterior para excluí-lo.

<input type="text" value="Search" onfocus="this.select();" />
17 de 26
fonte
0

Gosto da solução do "Knowledge Chikuse" - simples e clara. Só é necessário adicionar uma chamada para desfocar quando o carregamento da página estiver pronto, o que definirá o estado inicial:

$('input[value="text"]').blur();
Isaac Liu
fonte
0

Você deseja atribuir algo assim ao onfocus:

if (this.value == this.defaultValue)
    this.value = ''
this.className = ''

e isso para onblur:

if (this.value == '')
    this.value = this.defaultValue
this.className = 'placeholder'

(Você pode usar algo um pouco mais inteligente, como uma função de estrutura, para alternar o nome da classe, se desejar.)

Com alguns CSS como este:

input.placeholder{
    color: gray;
    font-style: italic;
}
Dan
fonte
0

Estou usando uma solução javascript simples de uma linha que funciona muito bem. Aqui está um exemplo para a caixa de texto e para a área de texto:

    <textarea onfocus="if (this.value == 'Text') { this.value = ''; }" onblur="if (this.value == '') { this.value = 'Text'; }">Text</textarea>

    <input type="text" value="Text" onfocus="if (this.value == 'Text') { this.value = ''; }" onblur="if (this.value == '') { this.value = 'Text'; }">

a única "desvantagem" é validar em $ _POST ou na validação Javascript antes de fazer qualquer coisa com o valor do campo. Ou seja, verificar se o valor do campo não é "Texto".

Kosem
fonte
-1
$('input[value="text"]').focus(function(){ 
if ($(this).attr('class')=='hint') 
{ 
   $(this).removeClass('hint'); 
   $(this).val(''); 
}
});

$('input[value="text"]').blur(function(){
  if($(this).val() == '')
  {
    $(this).addClass('hint');
    $(this).val($(this).attr('title'));
  } 
});

<input type="text" value="" title="Default Watermark Text">
Drew Noakes
fonte
-1

A tag simples 'exigida' em HTML é útil.

<form>
<input type="text" name="test" id="test" required>
<input type="submit" value="enter">
</form>

Especifica que um campo de entrada deve ser preenchido antes de enviar o formulário ou pressione o botão enviar. Aqui está um exemplo

Pradeep
fonte
Embora seja útil, não tem nada a ver com a questão.
Quentin