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.


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();

@ 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:


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


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

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.


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 .


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.




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.


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).


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.


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

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

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();" />

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();

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

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


-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

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


Meskipun bermanfaat, tidak ada hubungannya dengan pertanyaan.
Quentin

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.