¿Cómo hago que un cuadro de texto HTML muestre una pista cuando está vacío?

210

Quiero que el cuadro de búsqueda en mi página web muestre la palabra "Buscar" en cursiva gris. Cuando el cuadro recibe el foco, debería verse como un cuadro de texto vacío. Si ya hay texto, debe mostrar el texto normalmente (negro, sin cursiva). Esto me ayudará a evitar el desorden quitando la etiqueta.

Por cierto, esta es una búsqueda de Ajax en la página , por lo que no tiene botón.

Michael L Perry
fuente
44
desde que se hizo la pregunta, el atributo de marcador de posición HTML5 ha sido admitido por todos los navegadores.
Jasen
Hola Michael. ¿Estaría dispuesto a cambiar la respuesta aceptada en esta página? Parece que hay un claro ganador, que es diferente a la respuesta aceptada.
nulo
El problema con una solución de JavaScript es que no todos tienen JavaScript activado. El marcador de posición no desaparece cuando el cuadro de texto se enfoca si se usa un complemento de navegador como NoScript (muy útil para que los desarrolladores lo hayan instalado). La opción de marcador de posición es la solución más sólida.
Sablefoste

Respuestas:

365

Otra opción, si está contento de tener esta característica solo para los navegadores más nuevos, es utilizar el soporte ofrecido por el atributo de marcador de posición de HTML 5 :

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

En ausencia de cualquier estilo, en Chrome esto se ve así:

ingrese la descripción de la imagen aquí

Puedes probar demos aquí y en HTML5 Placeholder Styling con CSS .

Asegúrese de verificar la compatibilidad del navegador de esta función . El soporte en Firefox se agregó en 3.7. Chrome está bien. Internet Explorer solo agregó soporte en 10. Si apunta a un navegador que no admite marcadores de posición de entrada, puede usar un complemento jQuery llamado jQuery HTML5 Placeholder , y luego simplemente agregue el siguiente código JavaScript para habilitarlo.

$('input[placeholder], textarea[placeholder]').placeholder();
Drew Noakes
fuente
@Duke, funciona en Fx3.7 +, (Safari / Chrome) y Opera. IE9 no lo admite, así que supongo que IE8 tampoco.
Alessandro Vermeulen
Sí, acabo de enterar hoy que FF3.6 no lo admite.
Drew Noakes
Creo que se movió de nuevo. Lo encontré aquí: github.com/mathiasbynens/jquery-placeholder
jocull
Advertencia del desarrollador "Internet Explorer 10 y 11 no muestran el marcador de posición cuando el campo está enfocado, incluso si el campo está vacío".
Coronel Panic
92

Eso se conoce como marca de agua de cuadro de texto, y se realiza a través de JavaScript.

o si usa jQuery, un enfoque mucho mejor:

naspinski
fuente
44
Ese segundo enlace está roto. Esto podría ser similar: digitalbush.com/projects/watermark-input-plugin
Michael Haren
14
Encontré otro enfoque jQuery. este proyecto está alojado en @ code.google.com/p/jquery-watermark
JP Hellemons
44
El plugin digitalbrush guardará la 'marca de agua' en la base de datos. Está en versión beta y no se ha actualizado desde 2007. Recomiendo usar code.google.com/p/jquery-watermark como sugirió @JP.
Kimball Robinson el
1
Creo que el autor de la pregunta debería regresar y marcar el comentario de @JP como la mejor respuesta.
Randy L
2
El complemento de marca de agua jQuery es bastante novato porque no maneja el caso donde la entrada es la misma que el valor precargado. En ese caso, hace que su texto de entrada sea gris nuevamente.
atp
41

Puede establecer el marcador de posición utilizando el placeholderatributo en HTML ( soporte del navegador ). El font-styley colorse puede cambiar con CSS (aunque el soporte del navegador es 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
fuente
Estaba buscando esto, ta - más información diveintohtml5.org/forms.html#placeholder
David Yell
2
Esta debería ser ahora la respuesta aceptada. Es posible que el atributo de marcador de posición no haya sido ampliamente compatible cuando se publicó originalmente en 2010, pero ahora es compatible con todos los navegadores actuales, excepto IE8.
JSP64
20

Puede agregar y eliminar una clase CSS especial y modificar el valor de entrada onfocus/ onblurcon 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...'; }">

Luego, especifique una clase de pista con el estilo que desea en su CSS, por ejemplo:

input.hint {
    color: grey;
}
levik
fuente
2
He publicado una respuesta que hace lo mismo pero de una manera más conveniente y fácil de mantener: stackoverflow.com/questions/108207/…
Drew Noakes
6

La mejor manera es conectar sus eventos de JavaScript utilizando algún tipo de biblioteca de JavaScript como jQuery o YUI y colocar su código en un archivo externo .js.

Pero si desea una solución rápida y sucia, esta es su solución HTML en línea:

<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'}" />

Actualizado : se agregó el material para colorear solicitado.

Seb Nilsson
fuente
Esto está bien para las búsquedas, pero en muchos casos no desea que se envíen marcas de agua en ningún evento de envío.
Kimball Robinson el
@ k.robinson I +1 esa declaración. Este fue el código más rápido y compacto en ese momento. Se podría resolver de forma más precisa con un bloque de código javascript.
Seb Nilsson
4

Publiqué una solución para esto en mi sitio web hace algún tiempo. Para usarlo, importe un solo .jsarchivo:

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

Luego anote cualquier entrada que desee tener pistas con la clase CSS hintTextbox:

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

Más información y ejemplos están disponibles aquí .

Drew Noakes
fuente
1
Pero está roto. Si ingresé el mismo texto que era la sugerencia, se comporta como si no se hubiera ingresado (si ingreso y luego vuelvo a salir)
Stephan Eggermont
2
@Stephan: Sí, esa es la única advertencia que conozco. ¿Realmente has encontrado que eso es un problema en la práctica? Si es así, es posible que deba investigar la superposición de capas de un div arriba y mostrarlo / ocultarlo. Esta es la solución más simple que conozco. También me degrada muy bien si JavaScript está deshabilitado.
Drew Noakes
Fui activado por la configuración del valor. Tengo una necesidad combinada de rellenar previamente con un valor existente o predeterminado y una sugerencia cuando el cuadro de texto está vacío
Stephan Eggermont
@Stephan: hoy me he encontrado con una necesidad de esto y estoy buscando complementos de jQuery. El que está vinculado en la respuesta aceptada sufre el mismo problema que el mío. ¿Conoces una alternativa?
Drew Noakes
3

Aquí hay un ejemplo funcional con el caché de la biblioteca de Google Ajax y algo de magia jQuery.

Este sería el CSS:

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

Este sería el 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>

Y este sería el 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 sea suficiente para interesarle tanto en GAJAXLibs como en jQuery.

Gustavo Carreño
fuente
2

Encontré que el complemento jQuery jQuery Watermark es mejor que el que aparece en la respuesta superior. ¿Por qué mejor? Porque admite campos de entrada de contraseña. Además, establecer el color de la marca de agua (u otros atributos) es tan fácil como crear una .watermarkreferencia en su archivo CSS.

Dustin
fuente
2

Esto se llama "marca de agua".

Encontré la marca de agua jQuery plugin jQuery que, a diferencia de la primera respuesta, no requiere configuración adicional (la respuesta original también necesita una llamada especial antes de enviar el formulario).

elcuco
fuente
2

Use jQuery Form Notifier : es uno de los complementos más populares de jQuery y no sufre los errores que algunas de las otras sugerencias de jQuery hacen aquí (por ejemplo, puede diseñar libremente la marca de agua, sin preocuparse si se guardará en el base de datos).

jQuery Watermark usa un único estilo CSS directamente en los elementos del formulario (noté que las propiedades de tamaño de fuente CSS aplicadas a la marca de agua también afectaron los cuadros de texto, no lo que quería). La ventaja de jQuery Watermark es que puede arrastrar y soltar texto en los campos (jQuery Form Notifier no lo permite).

Otro sugerido por otros (el que está en digitalbrush.com), enviará accidentalmente el valor de la marca de agua a su formulario, por lo que le recomiendo que no lo haga.

Kimball Robinson
fuente
1

Use una imagen de fondo para representar el texto:

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

Entonces todo lo que tiene que hacer es detectar value == 0y aplicar la clase correcta:

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

Y el código jQuery JavaScript se ve así:

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

Puede hacer que un cuadro lea "Buscar" y luego, cuando se cambie el foco, se eliminará el texto. Algo como esto:

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

Por supuesto, si lo hace, el propio texto del usuario desaparecerá cuando haga clic. Así que probablemente quieras usar algo más 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">
J H_
fuente
0

Cuando se cargue la página por primera vez, haga que aparezca Buscar en el cuadro de texto, de color gris si así lo desea.

Cuando el cuadro de entrada recibe el foco, seleccione todo el texto en el cuadro de búsqueda para que el usuario pueda comenzar a escribir, lo que eliminará el texto seleccionado en el proceso. Esto también funcionará bien si el usuario quiere usar el cuadro de búsqueda por segunda vez, ya que no tendrá que resaltar manualmente el texto anterior para eliminarlo.

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

Me gusta la solución de "Knowledge Chikuse": simple y clara. Solo necesita agregar una llamada para desenfocar cuando la carga de la página está lista, lo que establecerá el estado inicial:

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

Desea asignar algo como esto a onfocus:

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

y esto para onblur:

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

(Puede usar algo un poco más inteligente, como una función de marco, para cambiar el nombre de clase si lo desea).

Con algunos CSS como este:

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

Estoy usando una solución javascript simple de una línea que funciona muy bien. Aquí hay un ejemplo tanto para textbox como para textarea:

    <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'; }">

El único "inconveniente" es validar en $ _POST o en la validación de Javascript antes de hacer algo con el valor del campo. Es decir, verificar que el valor del campo no sea "Texto".

Kosem
fuente
-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
fuente
-1

La etiqueta simple 'requerido' de HTML es útil.

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

Especifica que se debe completar un campo de entrada antes de enviar el formulario o presionar el botón enviar. Aquí hay un ejemplo

Pradeep
fuente
Si bien es útil, no tiene nada que ver con la pregunta.
Quentin