ฉันจะทำให้กล่องข้อความ HTML แสดงคำใบ้เมื่อว่างได้อย่างไร


210

ฉันต้องการช่องค้นหาในหน้าเว็บของฉันเพื่อแสดงคำว่า "ค้นหา" ในตัวเอียงสีเทา เมื่อกล่องได้รับโฟกัสมันควรดูเหมือนกล่องข้อความเปล่า หากมีข้อความอยู่แล้วควรแสดงข้อความตามปกติ (สีดำไม่ใช่ตัวเอียง) สิ่งนี้จะช่วยให้ฉันหลีกเลี่ยงความยุ่งเหยิงได้โดยการนำฉลากออก

BTW นี่คือการค้นหาAjax ในหน้าดังนั้นจึงไม่มีปุ่ม


4
เนื่องจากคำถามถูกถามคุณลักษณะ HTML5 ตัวยึดได้รับการสนับสนุนโดยเบราว์เซอร์ทั้งหมด
Jasen

สวัสดีไมเคิล คุณยินดีที่จะเปลี่ยนคำตอบที่ยอมรับในหน้านี้หรือไม่? ดูเหมือนจะมีผู้ชนะที่ชัดเจนซึ่งแตกต่างจากคำตอบที่ยอมรับ
null

ปัญหาเกี่ยวกับโซลูชัน JavaScript คือไม่ใช่ทุกคนที่เปิดใช้งาน JavaScript ตัวยึดตำแหน่งจะไม่หายไปเมื่อกล่องข้อความโฟกัสหากใช้ปลั๊กอินของเบราว์เซอร์เช่น NoScript (มีประโยชน์มากสำหรับนักพัฒนาที่จะติดตั้ง) ตัวเลือกตัวแทนเป็นทางออกที่แข็งแกร่งที่สุด
Sablefoste

คำตอบ:


365

ตัวเลือกอื่นหากคุณยินดีที่จะใช้คุณสมบัตินี้เฉพาะเบราว์เซอร์ที่ใหม่กว่าก็คือการใช้การสนับสนุนที่เสนอโดยแอตทริบิวต์ตัวยึดตำแหน่งของ HTML 5 :

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

หากไม่มีสไตล์ใด ๆ ใน Chrome จะมีลักษณะดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถลองสาธิตออกมาที่นี่และในHTML5 ตัวยึดตำแหน่งจัดแต่งทรงผมด้วย CSS

อย่าลืมตรวจสอบความเข้ากันได้ของเบราว์เซอร์ของคุณสมบัตินี้ มีการเพิ่มการสนับสนุนใน Firefox ใน 3.7 Chrome ใช้ได้ Internet Explorer เพิ่มการสนับสนุนใน 10 เท่านั้นหากคุณกำหนดเป้าหมายเบราว์เซอร์ที่ไม่รองรับตัวยึดตำแหน่งอินพุตคุณสามารถใช้ปลั๊กอินjQuery ที่เรียกว่าjQuery HTML5 Placeholderจากนั้นเพิ่มโค้ด JavaScript ต่อไปนี้เพื่อเปิดใช้งาน

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

@Duke ใช้งานได้ใน Fx3.7 +, (Safari / Chrome) และ Opera IE9 ไม่รองรับดังนั้นฉันเดาว่า IE8 ก็ไม่เหมือนกัน
Alessandro Vermeulen

ใช่ฉันเพิ่งทราบในวันนี้ว่า FF3.6 ไม่รองรับ
Drew Noakes

ฉันคิดว่ามันย้ายอีกครั้ง ฉันพบมันที่นี่: github.com/mathiasbynens/jquery-placeholder
jocull

ผู้พัฒนา Caveat "Internet Explorer 10 และ 11 จะไม่แสดงตัวยึดตำแหน่งเมื่อมีการโฟกัสฟิลด์แม้ว่าฟิลด์นั้นจะว่างเปล่า"
พันเอก Panic

92

ที่รู้จักกันว่าเป็นลายน้ำกล่องข้อความและจะทำผ่าน JavaScript

หรือถ้าคุณใช้ jQuery เป็นวิธีที่ดีกว่ามาก:


4
ลิงค์ที่สองนั้นเสีย นี้อาจจะคล้ายกัน: digitalbush.com/projects/watermark-input-plugin
ไมเคิลฮาเรน

14
พบวิธีการ jQuery อื่น โครงการนี้โฮสต์ @ code.google.com/p/jquery-watermark
JP Hellemons

4
ปลั๊กอินแปรงดิจิตอลจะบันทึก 'ลายน้ำ' ลงในฐานข้อมูล เป็นรุ่นเบต้าและยังไม่ได้รับการปรับปรุงตั้งแต่ปี 2007 ฉันแนะนำให้ใช้code.google.com/p/jquery-watermarkแทนตามที่ @JP แนะนำ
Kimball Robinson

1
ฉันคิดว่าผู้เขียนคำถามควรย้อนกลับไปและทำเครื่องหมายความคิดเห็น @JP เป็นคำตอบที่ดีที่สุด
แรนดี้ L

2
ปลั๊กอินลายน้ำ jQuery นั้นค่อนข้างน่าสนใจเพราะมันไม่ได้จัดการกับกรณีที่อินพุตเหมือนกันกับค่าที่เติมไว้ล่วงหน้า ในกรณีนี้มันทำให้ข้อความอินพุตของคุณเป็นสีเทาอีกครั้ง!
atp

41

คุณสามารถกำหนดตัวยึดตำแหน่งโดยใช้placeholderแอตทริบิวต์ใน HTML ( การสนับสนุนเบราว์เซอร์ ) font-styleและcolorสามารถเปลี่ยนแปลงได้ด้วย CSS (แม้ว่าการสนับสนุนเบราว์เซอร์ จำกัด )

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


กำลังมองหาสิ่งนี้ ta - ข้อมูลเพิ่มเติมdiveintohtml5.org/forms.html#placeholder
David Yell

2
ตอนนี้ควรเป็นคำตอบที่ยอมรับได้ แอตทริบิวต์ตัวยึดอาจไม่ได้รับการสนับสนุนอย่างกว้างขวางเมื่อมีการโพสต์ครั้งแรกในปี 2010 แต่ตอนนี้เบราว์เซอร์ปัจจุบันได้รับการสนับสนุนยกเว้น IE8
JSP64

20

คุณสามารถเพิ่มและลบคลาส CSS พิเศษและแก้ไขค่าอินพุตonfocus/ onblurด้วย 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...'; }">

จากนั้นระบุคลาสคำใบ้ด้วยสไตล์ที่คุณต้องการใน CSS ของคุณ:

input.hint {
    color: grey;
}

2
ฉันโพสต์คำตอบที่ทำสิ่งเดียวกัน แต่ในวิธีที่สะดวกและบำรุงรักษามากขึ้น: stackoverflow.com/questions/108207/ …
Drew Noakes

6

วิธีที่ดีที่สุดคือการวางสายกิจกรรม JavaScript ของคุณโดยใช้ไลบรารี JavaScript บางประเภทเช่นjQueryหรือYUIและใส่รหัสของคุณในไฟล์. js-external

แต่ถ้าคุณต้องการโซลูชันที่รวดเร็วและสกปรกนี่คือโซลูชัน HTML แบบอินไลน์ของคุณ:

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

อัปเดต : เพิ่มการระบายสีตามที่ขอ


สิ่งนี้ใช้ได้สำหรับการค้นหา แต่ในหลายกรณีคุณไม่ต้องการให้ส่งลายน้ำในกิจกรรมส่งใด ๆ
Kimball Robinson

@ k.robinson ฉัน +1 ข้อความนั้น นี่เป็นรหัสที่เร็วและกะทัดรัดที่สุดในขณะนั้น สามารถแก้ไขได้ละเอียดยิ่งขึ้นด้วยโค้ดบล็อกจาวาสคริปต์
Seb Nilsson

4

ฉันโพสต์คำตอบสำหรับสิ่งนี้บนเว็บไซต์ของฉันเมื่อไม่นานมานี้ หากต้องการใช้งานให้นำเข้า.jsไฟล์เดียว:

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

จากนั้นใส่คำอธิบายประกอบอินพุตใด ๆ ที่คุณต้องการให้มีคำใบ้กับคลาส CSS hintTextbox:

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

ข้อมูลเพิ่มเติมและตัวอย่างที่มีอยู่ที่นี่


1
แต่มันก็หัก ถ้าฉันป้อนข้อความเดียวกับที่เป็นตัวบอกว่ามันจะทำงานเหมือนไม่มีการป้อนข้อมูล (ถ้าแท็บเข้าและจากนั้นอีกครั้ง)
Stephan Eggermont

2
@ สเตฟาน: ใช่นั่นเป็นข้อแม้เดียวที่ฉันรู้ คุณพบจริงหรือไม่ว่าเป็นปัญหาในทางปฏิบัติ? ถ้าเป็นเช่นนั้นคุณอาจต้องตรวจสอบ layering div ด้านบนและแสดง / ซ่อนมัน นี่เป็นทางออกที่ง่ายที่สุดที่ฉันรู้ ฉันลดระดับลงเช่นกันหากปิดการใช้งาน JavaScript
Drew Noakes

ฉันถูกกระตุ้นโดยการตั้งค่า ฉันมีความต้องการรวมกันของการเติมล่วงหน้าด้วยค่าที่มีอยู่หรือค่าเริ่มต้นและคำใบ้เมื่อกล่องข้อความว่างเปล่า
Stephan Eggermont

@Stephan - วันนี้ฉันเจอสิ่งที่ต้องการแล้วและกำลังดูปลั๊กอิน jQuery คำตอบที่ได้รับการยอมรับนั้นเชื่อมโยงกับคำตอบที่ได้รับการยอมรับว่าเป็นปัญหาของฉัน คุณรู้จักทางเลือกอื่นหรือไม่?
Drew Noakes

3

นี่คือตัวอย่างการทำงานกับแคชไลบรารีของ Google Ajax และเวทมนตร์ jQuery

นี่จะเป็น CSS:

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

นี่จะเป็นรหัส 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>

และนี่จะเป็น 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>

ฉันหวังว่ามันจะเพียงพอที่จะทำให้คุณสนใจทั้ง GAJAXLibs และ jQuery


3

ตอนนี้มันง่ายมาก ใน html เราสามารถให้แอตทริบิวต์ตัวยึดตำแหน่งสำหรับองค์ประกอบอินพุต

เช่น

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

ตรวจสอบรายละเอียดเพิ่มเติมได้ที่: http://www.w3schools.com/tags/att_input_placeholder.asp


2

สำหรับผู้ใช้ jQuery: ลิงก์ jQuery ของ naspinski ดูเหมือนจะเสียหาย แต่ลองทำสิ่งนี้: http://remysharp.com/2007/01/25/jquery-tutorial-text-box-hints/

คุณจะได้รับการสอนปลั๊กอิน jQuery ฟรีเป็นโบนัส :)


ฉันใช้ปลั๊กอินของ Remy ที่tripfootprint.comและใช้งานได้ดี ฉันชอบที่มันง่ายพอที่จะติดตามและไปมา
Anirvan

2

ฉันพบ jQuery plugin jQuery Watermarkจะดีกว่าที่ระบุไว้ในคำตอบยอดนิยม ทำไมถึงดีกว่า เพราะมันรองรับช่องใส่รหัสผ่าน นอกจากนี้การตั้งค่าสีของลายน้ำ (หรือแอตทริบิวต์อื่น ๆ ) นั้นง่ายเหมือนการสร้างการ.watermarkอ้างอิงในไฟล์ CSS ของคุณ


2

สิ่งนี้เรียกว่า "ลายน้ำ"

ฉันพบปลั๊กอินลายน้ำ jQuery jQueryซึ่งไม่เหมือนคำตอบแรกไม่จำเป็นต้องตั้งค่าเพิ่มเติม (คำตอบเดิมต้องมีการโทรพิเศษก่อนที่จะส่งแบบฟอร์ม)


2

ใช้jQuery Form Notifier - เป็นหนึ่งในปลั๊กอิน jQuery ที่ได้รับความนิยมมากที่สุดและไม่ได้รับความผิดพลาดจากข้อเสนอแนะอื่น ๆ ของ jQuery ที่นี่ (ตัวอย่างเช่นคุณสามารถกำหนดลายน้ำได้อย่างอิสระโดยไม่ต้องกังวลว่าจะถูกบันทึกไว้ใน ฐานข้อมูล)

jQuery Watermark ใช้ CSS สไตล์เดียวบนอิลิเมนต์แบบฟอร์มโดยตรง (ฉันสังเกตเห็นว่าคุณสมบัติขนาดตัวอักษร CSS ที่ใช้กับลายน้ำนั้นส่งผลต่อกล่องข้อความด้วย - ไม่ใช่สิ่งที่ฉันต้องการ) เครื่องหมายบวกกับ jQuery Watermark คือคุณสามารถลากข้อความลงในช่อง (jQuery Form Notifier ไม่อนุญาตสิ่งนี้)

อีกอันที่คนอื่นแนะนำ (คนที่ digitalbrush.com) จะส่งค่าลายน้ำไปยังแบบฟอร์มของคุณโดยบังเอิญดังนั้นฉันขอแนะนำอย่างยิ่ง


1

ใช้ภาพพื้นหลังเพื่อแสดงข้อความ:

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

จากนั้นสิ่งที่คุณต้องทำคือตรวจจับvalue == 0และใช้คลาสที่เหมาะสม:

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

และรหัส jQuery JavaScript มีลักษณะดังนี้:

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

1

คุณสามารถให้กล่องอ่าน "ค้นหา" ได้ง่ายจากนั้นเมื่อเปลี่ยนโฟกัสไปที่กล่องข้อความจะถูกลบออก บางสิ่งเช่นนี้

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

แน่นอนถ้าคุณทำเช่นนั้นข้อความของผู้ใช้จะหายไปเมื่อพวกเขาคลิก ดังนั้นคุณอาจต้องการใช้สิ่งที่แข็งแกร่งกว่านี้:

<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

เมื่อเพจโหลดครั้งแรกให้มีการค้นหาปรากฏในกล่องข้อความโดยมีสีเทาเป็นสีถ้าคุณต้องการให้เป็น

เมื่อกล่องอินพุตได้รับโฟกัสเลือกข้อความทั้งหมดในกล่องค้นหาเพื่อให้ผู้ใช้สามารถเริ่มพิมพ์ได้ซึ่งจะลบข้อความที่เลือกในกระบวนการ วิธีนี้จะใช้งานได้ดีหากผู้ใช้ต้องการใช้ช่องค้นหาเป็นครั้งที่สองเนื่องจากพวกเขาไม่ต้องเน้นข้อความก่อนหน้าด้วยตนเองเพื่อลบ

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

0

ฉันชอบทางออกของ "Knowledge Chikuse" - เรียบง่ายและชัดเจน จำเป็นต้องเพิ่มการเรียกเพื่อเบลอเมื่อโหลดหน้าพร้อมซึ่งจะตั้งค่าสถานะเริ่มต้น:

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

0

คุณต้องการมอบหมายบางสิ่งเช่นนี้ให้กับออนโฟกัส:

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

และนี่เพื่อ onblur:

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

(คุณสามารถใช้บางสิ่งที่ฉลาดกว่าเล็กน้อยเช่นฟังก์ชั่นกรอบงานเพื่อทำการสลับคลาสหากคุณต้องการ)

ด้วย CSS บางอย่างเช่นนี้:

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

0

ฉันกำลังใช้โซลูชัน Javascript แบบบรรทัดเดียวที่ใช้งานได้ดี นี่คือตัวอย่างทั้งสำหรับกล่องข้อความและสำหรับ 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'; }">

เฉพาะ "ข้อเสีย" คือการตรวจสอบความถูกต้องที่ $ _POST หรือในการตรวจสอบความถูกต้องของ Javascript ก่อนที่จะทำสิ่งใด ๆ ที่มีค่าของฟิลด์ หมายความว่าตรวจสอบว่าค่าของฟิลด์ไม่ใช่ "ข้อความ"


-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

แท็ก Html แบบง่าย 'จำเป็นต้องใช้' มีประโยชน์

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

มันระบุว่าช่องใส่จะต้องกรอกก่อนที่จะส่งแบบฟอร์มหรือกดปุ่มส่ง นี่คือตัวอย่าง


แม้ว่ามันจะมีประโยชน์ แต่ก็ไม่มีอะไรเกี่ยวข้องกับคำถาม
เควนติน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.