Come posso fare in modo che una casella di testo HTML mostri un suggerimento quando è vuota?


210

Voglio che la casella di ricerca sulla mia pagina web visualizzi la parola "Cerca" in corsivo grigio. Quando la casella riceve lo stato attivo, dovrebbe apparire come una casella di testo vuota. Se è già presente del testo, dovrebbe visualizzarlo normalmente (nero, non corsivo). Questo mi aiuterà a evitare il disordine rimuovendo l'etichetta.

A proposito, questa è una ricerca Ajax sulla pagina , quindi non ha alcun pulsante.


4
da quando è stata posta la domanda, l'attributo segnaposto HTML5 è stato supportato da tutti i browser.
Jasen,

Ciao Michael Saresti disposto a cambiare la risposta accettata in questa pagina? Sembra esserci un chiaro vincitore, che è diverso dalla risposta accettata.
null

Il problema con una soluzione JavaScript è che non tutti hanno attivato JavaScript. Il segnaposto non scompare quando la casella di testo viene attivata se si utilizza un plug-in del browser come NoScript (molto utile per gli sviluppatori che hanno installato). L'opzione segnaposto è la soluzione più affidabile.
Sablefoste,

Risposte:


365

Un'altra opzione, se sei felice di avere questa funzione solo per i browser più recenti, è quella di utilizzare il supporto offerto dall'attributo segnaposto HTML 5 :

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

In assenza di stili, in Chrome sembra che:

inserisci qui la descrizione dell'immagine

Puoi provare le demo qui e in HTML5 Placeholder Styling con CSS .

Assicurati di controllare la compatibilità del browser di questa funzione . Il supporto per Firefox è stato aggiunto in 3.7. Chrome va bene. Internet Explorer ha aggiunto il supporto solo in 10. Se scegli come target un browser che non supporta segnaposto di input, puoi utilizzare un plug-in jQuery chiamato segnaposto HTML5 jQuery , quindi aggiungere il seguente codice JavaScript per abilitarlo.

$('input[placeholder], textarea[placeholder]').placeholder();

@Duke, funziona in Fx3.7 +, (Safari / Chrome) e Opera. IE9 non lo supporta, quindi immagino che neanche IE8 lo faccia.
Alessandro Vermeulen,

Sì, ho appena scoperto che FF3.6 non lo supporta.
Drew Noakes,

Penso che sia stato spostato di nuovo. L'ho trovato qui: github.com/mathiasbynens/jquery-placeholder
jocull

Sviluppatore Caveat "Internet Explorer 10 e 11 non mostrano il segnaposto quando il campo è attivo, anche se il campo è vuoto".
Colonnello Panic,

92

Questa è nota come filigrana della casella di testo e viene eseguita tramite JavaScript.

o se usi jQuery, un approccio molto migliore:


4
Quel secondo collegamento è interrotto. Questo potrebbe essere simile: digitalbush.com/projects/watermark-input-plugin
Michael Haren,

14
Ho trovato un altro approccio jQuery. questo progetto è ospitato su @ code.google.com/p/jquery-watermark
JP Hellemons,

4
Il plug-in digitalbrush salverà la 'filigrana' nel database. È in beta e non è stato aggiornato dal 2007. Consiglio invece di utilizzare code.google.com/p/jquery-watermark come suggerito da @JP.
Kimball Robinson,

1
penso che l'autore della domanda dovrebbe tornare indietro e contrassegnare il commento @JP come la migliore risposta.
Randy L,

2
Il plug-in filigrana jQuery è piuttosto rumoroso perché non gestisce il caso in cui l'input è lo stesso del valore pre-riempito. In tal caso, rende di nuovo grigio il testo di input!
atp

41

È possibile impostare il segnaposto utilizzando l' placeholderattributo in HTML ( supporto del browser ). L' font-stylee colorpuò essere cambiata con i CSS (anche se il supporto del browser è limitata).

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">



2
Questa dovrebbe ora essere la risposta accettata. L'attributo segnaposto potrebbe non essere stato ampiamente supportato quando è stato pubblicato originariamente nel 2010, ma ora è supportato da tutti i browser attuali tranne IE8.
JSP64

20

È possibile aggiungere e rimuovere una classe CSS speciale e modificare il valore di input 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...'; }">

Quindi specificare una classe di suggerimenti con lo stile desiderato nel CSS, ad esempio:

input.hint {
    color: grey;
}

2
Ho pubblicato una risposta che fa la stessa cosa ma in un modo più conveniente e mantenibile: stackoverflow.com/questions/108207/…
Drew Noakes

6

Il modo migliore è collegare i tuoi eventi JavaScript usando una specie di libreria JavaScript come jQuery o YUI e inserire il tuo codice in un file .js esterno.

Ma se vuoi una soluzione rapida e sporca, questa è la tua soluzione HTML in linea:

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

Aggiornato : aggiunti gli elementi coloranti richiesti.


Questo è OK per le ricerche, ma in molti casi non si desidera che le filigrane vengano inviate a qualsiasi evento di invio.
Kimball Robinson,

@ k.robinson I +1 quella dichiarazione. Questo era il codice più veloce e compatto in quel momento. Potrebbe essere risolto in modo più dettagliato con un blocco di codice javascript.
Seb Nilsson,

4

Ho pubblicato una soluzione per questo sul mio sito Web qualche tempo fa. Per usarlo, importa un singolo .jsfile:

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

Quindi annota tutti gli input che vuoi avere suggerimenti con la classe CSS hintTextbox:

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

Maggiori informazioni ed esempi sono disponibili qui .


1
Ma è rotto. Se inserisco lo stesso testo che era il suggerimento, si comporta come se non fosse stato fornito alcun input (se inserisco e poi riparo da esso)
Stephan Eggermont,

2
@Stephan: Sì, questo è l'unico avvertimento che conosco. Hai effettivamente scoperto che si tratta in pratica di un problema? In tal caso, potrebbe essere necessario esaminare la suddivisione in livelli di un div sopra e visualizzarlo / nasconderlo. Questa è la soluzione più semplice che conosco. Mi degrada bene anche se JavaScript è disabilitato.
Drew Noakes,

Sono stato attivato dall'impostazione del valore. Ho una necessità combinata di pre-riempimento con un valore esistente o predefinito e un suggerimento quando la casella di testo è vuota
Stephan Eggermont,

@Stephan - Oggi ho riscontrato la necessità di questo e sto guardando i plugin jQuery. Quello collegato alla risposta accettata soffre dello stesso problema che il mio. Conosci un'alternativa?
Drew Noakes,

3

Ecco un esempio funzionale con la cache della libreria Google Ajax e un po 'di magia jQuery.

Questo sarebbe il CSS:

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

Questo sarebbe il codice 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 questo sarebbe l'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>

Spero sia abbastanza per farti interessare sia a GAJAXLibs che a jQuery.




2

Ho trovato il plug-in jQuery jQuery Watermark migliore di quello elencato nella risposta in alto. Perché meglio? Perché supporta i campi di immissione della password. Inoltre, impostare il colore della filigrana (o altri attributi) è facile come creare un .watermarkriferimento nel tuo file CSS.


2

Questo si chiama "filigrana".

Ho trovato il plug-in jQuery filigrana jQuery che, a differenza della prima risposta, non richiede un'impostazione aggiuntiva (la risposta originale richiede anche una chiamata speciale prima dell'invio del modulo).


2

Usa jQuery Form Notifier : è uno dei plugin jQuery più popolari e non soffre dei bug che alcuni degli altri suggerimenti di jQuery qui fanno (ad esempio, puoi liberamente modellare la filigrana, senza preoccuparti se verrà salvato nella Banca dati).

jQuery Watermark utilizza un singolo stile CSS direttamente sugli elementi del modulo (ho notato che le proprietà della dimensione del carattere CSS applicate alla filigrana hanno influenzato anche le caselle di testo, non quello che volevo). Il vantaggio di jQuery Watermark è che puoi trascinare il testo nei campi (jQuery Form Notifier non lo consente).

Un altro suggerito da altri (quello di digitalbrush.com), invierà accidentalmente il valore della filigrana al modulo, quindi sconsiglio vivamente di farlo.


1

Usa un'immagine di sfondo per rendere il testo:

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

Quindi tutto ciò che devi fare è rilevare value == 0e applicare la classe giusta:

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

E il codice JavaScript jQuery è simile al seguente:

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

1

Si potrebbe facilmente avere una casella che legge "Cerca", quindi quando lo stato attivo viene modificato su di esso è necessario rimuovere il testo. Qualcosa come questo:

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

Naturalmente, se lo fai, il testo dell'utente scompare quando fa clic. Quindi probabilmente vuoi usare qualcosa di più 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">

0

Quando la pagina viene caricata per la prima volta, fai apparire Cerca nella casella di testo, colorato di grigio se vuoi che sia.

Quando la casella di input riceve lo stato attivo, seleziona tutto il testo nella casella di ricerca in modo che l'utente possa semplicemente iniziare a digitare, che eliminerà il testo selezionato nel processo. Funzionerà bene anche se l'utente desidera utilizzare la casella di ricerca una seconda volta poiché non dovrà evidenziare manualmente il testo precedente per eliminarlo.

<input type="text" value="Search" onfocus="this.select();" />

0

Mi piace la soluzione di "Knowledge Chikuse": semplice e chiara. Devi solo aggiungere una chiamata per sfocare quando il caricamento della pagina è pronto che imposterà lo stato iniziale:

$('input[value="text"]').blur();

0

Vuoi assegnare qualcosa di simile a onfocus:

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

e questo per onblur:

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

(Puoi usare qualcosa di un po 'più intelligente, come una funzione framework, per cambiare il nome della classe se vuoi.)

Con alcuni CSS come questo:

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

0

Sto usando una semplice soluzione javascript a una riga che funziona alla grande. Ecco un esempio sia per textbox che per 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'; }">

l'unico "aspetto negativo" è convalidare a $ _POST o nella convalida Javascript prima di fare qualsiasi cosa con il valore del campo. Significato, verificando che il valore del campo non sia "Testo".


-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">

-1

Il tag 'richiesto' semplice HTML è utile.

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

Specifica che è necessario compilare un campo di input prima di inviare il modulo o premere il pulsante di invio. Ecco un esempio


Sebbene sia utile, non ha nulla a che fare con la domanda.
Quentin,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.