Bagaimana cara membuat kotak teks HTML menunjukkan petunjuk saat kosong?

210

Saya ingin kotak pencarian di halaman web saya untuk menampilkan kata "Cari" dengan huruf miring abu-abu. Ketika kotak menerima fokus, itu akan terlihat seperti kotak teks kosong. Jika sudah ada teks di dalamnya, itu akan menampilkan teks secara normal (hitam, non-miring). Ini akan membantu saya menghindari kekacauan dengan menghapus label.

BTW, ini adalah pencarian Ajax pada halaman , sehingga tidak memiliki tombol.

Michael L Perry
sumber
4
sejak pertanyaan diajukan, atribut placeholder HTML5 telah didukung oleh semua browser.
Jasen
Hai Michael. Apakah Anda bersedia mengubah jawaban yang diterima di halaman ini? Tampaknya ada pemenang yang jelas, yang berbeda dengan jawaban yang diterima.
null
Masalah dengan solusi JavaScript adalah tidak semua orang mengaktifkan JavaScript. Placeholder tidak hilang ketika kotak teks mendapat fokus jika menggunakan plug-in browser seperti NoScript (sangat berguna bagi pengembang untuk menginstal). Opsi Placeholder adalah solusi paling kuat.
Sablefoste

Jawaban:

365

Opsi lain, jika Anda senang memiliki fitur ini hanya untuk browser yang lebih baru, adalah menggunakan dukungan yang ditawarkan oleh atribut placeholder HTML 5 :

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

Dengan tidak adanya gaya apa pun, di Chrome ini terlihat seperti:

masukkan deskripsi gambar di sini

Anda dapat mencoba demo di sini dan di HTML5 Placeholder Styling dengan CSS .

Pastikan untuk memeriksa kompatibilitas browser dari fitur ini . Dukungan di Firefox telah ditambahkan di 3.7. Chrome baik-baik saja. Internet Explorer hanya menambahkan dukungan di 10. Jika Anda menargetkan browser yang tidak mendukung input placeholder, Anda dapat menggunakan plugin jQuery yang disebut jQuery HTML5 Placeholder , dan kemudian tambahkan saja kode JavaScript berikut untuk mengaktifkannya.

$('input[placeholder], textarea[placeholder]').placeholder();
Drew Noakes
sumber
@ Duke, ini bekerja di Fx3.7 +, (Safari / Chrome) dan Opera. IE9 tidak mendukungnya, jadi saya kira IE8 juga tidak.
Alessandro Vermeulen
Ya saya baru tahu hari ini bahwa FF3.6 tidak mendukungnya.
Drew Noakes
Saya pikir itu dipindahkan lagi. Saya menemukannya di sini: github.com/mathiasbynens/jquery-placeholder
jocull
Pengembang Caveat "Internet Explorer 10 dan 11 tidak menunjukkan placeholder ketika bidang difokuskan, bahkan jika bidang kosong."
Kolonel Panic
92

Itu dikenal sebagai tanda air kotak teks, dan dilakukan melalui JavaScript.

atau jika Anda menggunakan jQuery, pendekatan yang jauh lebih baik:

naspinski
sumber
4
Tautan kedua itu rusak. Ini mungkin serupa: digitalbush.com/projects/watermark-input-plugin
Michael Haren
14
Menemukan pendekatan jQuery lain. proyek ini di-host @ code.google.com/p/jquery-watermark
JP Hellemons
4
Plugin digitalbrush akan menyimpan 'tanda air' ke database. Ini dalam versi beta, dan belum diperbarui sejak 2007. Saya sarankan menggunakan code.google.com/p/jquery-watermark seperti yang disarankan @JP.
Kimball Robinson
1
Saya pikir penulis pertanyaan harus kembali dan tandai @ JP komentar sebagai jawaban terbaik.
Randy L
2
Plugin watermark jQuery cukup noob karena tidak menangani case di mana inputnya sama dengan nilai yang sudah diisi sebelumnya. Dalam hal ini, itu membuat teks input Anda menjadi abu-abu lagi!
atp
41

Anda dapat mengatur placeholder menggunakan placeholderatribut dalam HTML ( dukungan browser ). Itu font-styledan colordapat diubah dengan CSS (meskipun dukungan browser terbatas).

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
sumber
Sedang mencari ini, ta - info lebih lanjut diveintohtml5.org/forms.html#placeholder
David Yell
2
Sekarang ini seharusnya jawaban yang diterima. Atribut placeholder mungkin belum didukung secara luas saat ini awalnya diposting pada 2010, tetapi sekarang didukung oleh semua browser saat ini kecuali IE8.
JSP64
20

Anda dapat menambah dan menghapus kelas CSS khusus dan memodifikasi nilai input onfocus/ onblurdengan 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...'; }">

Kemudian tentukan kelas petunjuk dengan gaya yang Anda inginkan di CSS Anda misalnya:

input.hint {
    color: grey;
}
Levik
sumber
2
Saya telah memposting jawaban yang melakukan hal yang sama tetapi dengan cara yang lebih nyaman dan dapat dipelihara: stackoverflow.com/questions/108207/…
Drew Noakes
6

Cara terbaik adalah memasang acara JavaScript Anda menggunakan semacam perpustakaan JavaScript seperti jQuery atau YUI dan memasukkan kode Anda ke dalam file .js-eksternal.

Tetapi jika Anda menginginkan solusi cepat dan kotor, ini adalah solusi HTML inline Anda:

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

Diperbarui : Menambahkan barang pewarna yang diminta.

Seb Nilsson
sumber
Ini OK untuk pencarian, tetapi dalam banyak kasus Anda tidak ingin tanda air dikirimkan pada setiap acara pengiriman.
Kimball Robinson
@ k.robinson I memberi +1 pada pernyataan itu. Ini adalah kode tercepat dan paling ringkas pada saat itu. Itu bisa diselesaikan lebih halus dengan blok kode javascript.
Seb Nilsson
4

Saya memposting solusi untuk ini di situs web saya beberapa waktu lalu. Untuk menggunakannya, impor satu .jsfile:

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

Lalu beri catatan input apa pun yang Anda ingin memiliki petunjuk dengan kelas CSS hintTextbox:

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

Informasi dan contoh lebih lanjut tersedia di sini .

Drew Noakes
sumber
1
Tapi itu rusak. Jika saya memasukkan teks yang sama dengan isyarat, itu berperilaku seolah-olah tidak ada input yang diberikan (jika saya tab masuk dan keluar lagi)
Stephan Eggermont
2
@Stephan: Ya itu satu-satunya peringatan yang saya tahu. Apakah Anda benar-benar menemukan itu menjadi masalah dalam praktik? Jika demikian maka Anda mungkin harus menyelidiki layering div di atas dan menampilkan / menyembunyikannya. Ini adalah solusi paling sederhana yang saya tahu. Saya juga menurun dengan baik jika JavaScript dinonaktifkan.
Drew Noakes
Saya dipicu oleh pengaturan nilai. Saya memiliki kebutuhan gabungan pra-pengisian dengan nilai yang ada atau default dan petunjuk ketika kotak teks kosong
Stephan Eggermont
@Stephan - Saya benar-benar menemukan kebutuhan untuk hari ini dan saya sedang melihat plugin jQuery. Jawaban yang ditautkan dalam jawaban yang diterima mengalami masalah yang sama dengan yang saya alami. Apakah Anda tahu alternatifnya?
Drew Noakes
3

Berikut adalah contoh fungsional dengan cache perpustakaan Google Ajax dan beberapa sihir jQuery.

Ini akan menjadi CSS:

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

Ini akan menjadi kode 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>

Dan ini akan menjadi 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>

Saya harap itu cukup untuk membuat Anda tertarik pada GAJAXLibs dan jQuery.

Gustavo Carreno
sumber
3

Sekarang menjadi sangat mudah. Dalam html kita bisa memberikan atribut placeholder untuk elemen input .

misalnya

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

periksa lebih detail: http://www.w3schools.com/tags/att_input_placeholder.asp

apm
sumber
2

Saya menemukan plugin jQuery jQuery Watermark lebih baik daripada yang terdaftar di jawaban atas. Mengapa lebih baik Karena mendukung bidang input kata sandi. Juga, mengatur warna tanda air (atau atribut lainnya) semudah membuat .watermarkreferensi di file CSS Anda.

Dustin
sumber
2

Ini disebut "tanda air".

Saya menemukan plugin jQuery jQuery watermark yang, tidak seperti jawaban pertama, tidak memerlukan pengaturan tambahan (jawaban aslinya juga membutuhkan panggilan khusus untuk sebelum formulir dikirimkan).

elcuco
sumber
2

Gunakan jQuery Form Notifier - ini adalah salah satu plugin jQuery paling populer dan tidak menderita bug seperti yang dilakukan saran jQuery lainnya (misalnya, Anda dapat dengan bebas mendesain watermark, tanpa khawatir jika itu akan disimpan ke basis data).

jQuery Watermark menggunakan gaya CSS tunggal langsung pada elemen bentuk (saya perhatikan bahwa properti ukuran font CSS yang diterapkan pada tanda air juga memengaruhi kotak teks - bukan yang saya inginkan). Tanda plus dengan jQuery Watermark adalah Anda dapat menyeret-jatuhkan teks ke dalam bidang (Notifier Formulir jQuery tidak mengizinkan ini).

Yang lain disarankan oleh beberapa orang lain (yang di digitalbrush.com), secara tidak sengaja akan mengirimkan nilai tanda air ke formulir Anda, jadi saya sangat menyarankan untuk tidak melakukannya.

Kimball Robinson
sumber
1

Gunakan gambar latar belakang untuk merender teks:

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

Maka yang harus Anda lakukan adalah mendeteksi value == 0dan menerapkan kelas yang tepat:

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

Dan kode JavaScript jQuery terlihat seperti ini:

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

Anda dapat dengan mudah meminta sebuah kotak membaca "Cari" kemudian ketika fokus diubah sehingga teks dihapus. Sesuatu seperti ini:

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

Tentu saja jika Anda melakukannya, teks pengguna sendiri akan hilang ketika mereka mengklik. Jadi, Anda mungkin ingin menggunakan sesuatu yang lebih kuat:

<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_
sumber
0

Saat halaman pertama dimuat, ada Pencarian muncul di kotak teks, berwarna abu-abu jika Anda inginkan.

Ketika kotak input menerima fokus, pilih semua teks dalam kotak pencarian sehingga pengguna bisa mulai mengetik, yang akan menghapus teks yang dipilih dalam proses. Ini juga akan berfungsi dengan baik jika pengguna ingin menggunakan kotak pencarian untuk kedua kalinya karena mereka tidak perlu secara manual menyorot teks sebelumnya untuk menghapusnya.

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

Saya suka solusi "Knowledge Chikuse" - sederhana dan jelas. Hanya perlu menambahkan panggilan untuk mengaburkan saat memuat halaman siap yang akan mengatur keadaan awal:

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

Anda ingin menetapkan sesuatu seperti ini ke onfocus:

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

dan ini untuk blur:

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

(Anda dapat menggunakan sesuatu yang sedikit lebih pintar, seperti fungsi kerangka kerja, untuk melakukan pengalihan classname jika Anda mau.)

Dengan beberapa CSS seperti ini:

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

Saya menggunakan solusi javascript sederhana, satu baris yang sangat bagus. Berikut adalah contoh untuk textbox dan 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'; }">

hanya "downside" yang akan divalidasi pada $ _POST atau dalam validasi Javascript sebelum melakukan apa pun dengan nilai bidang. Artinya, memeriksa bahwa nilai bidang bukan "Teks".

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

Tag 'wajib' Html sederhana bermanfaat.

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

Ini menentukan bahwa bidang input harus diisi sebelum mengirimkan formulir atau tekan tombol kirim. Berikut ini contohnya

Pradeep
sumber
Meskipun bermanfaat, tidak ada hubungannya dengan pertanyaan.
Quentin