Làm cách nào để tạo một hộp văn bản HTML hiển thị một gợi ý khi trống?


210

Tôi muốn hộp tìm kiếm trên trang web của mình hiển thị từ "Tìm kiếm" bằng chữ in nghiêng màu xám. Khi hộp nhận được tiêu điểm, nó sẽ trông giống như một hộp văn bản trống. Nếu đã có văn bản trong đó, nó sẽ hiển thị văn bản bình thường (màu đen, không in nghiêng). Điều này sẽ giúp tôi tránh lộn xộn bằng cách loại bỏ nhãn.

BTW, đây là một tìm kiếm Ajax trên trang , vì vậy nó không có nút.


4
vì câu hỏi đã được hỏi, thuộc tính giữ chỗ HTML5 đã được hỗ trợ bởi tất cả các trình duyệt.
Jasen

Chào Michael. Bạn có sẵn sàng thay đổi câu trả lời được chấp nhận trên trang này không? Dường như có một người chiến thắng rõ ràng, khác với câu trả lời được chấp nhận.
null

Vấn đề với giải pháp JavaScript là không phải ai cũng bật JavaScript. Trình giữ chỗ không biến mất khi hộp văn bản được lấy nét nếu sử dụng trình cắm trình duyệt như NoScript (rất tiện cho các nhà phát triển đã cài đặt). Tùy chọn Placeholder là giải pháp mạnh mẽ nhất.
Sablefoste

Câu trả lời:


365

Một tùy chọn khác, nếu bạn vui mừng chỉ có tính năng này cho các trình duyệt mới hơn, là sử dụng hỗ trợ được cung cấp bởi thuộc tính giữ chỗ của HTML 5 :

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

Trong trường hợp không có bất kỳ kiểu nào, trong Chrome, giao diện này sẽ như sau:

nhập mô tả hình ảnh ở đây

Bạn có thể thử các bản demo ở đây và trong Kiểu dáng giữ chỗ HTML5 bằng CSS .

Hãy chắc chắn kiểm tra tính tương thích của trình duyệt của tính năng này . Hỗ trợ trong Firefox đã được thêm vào trong 3.7. Chrome vẫn ổn. Internet Explorer chỉ thêm hỗ trợ trong 10. Nếu bạn nhắm mục tiêu trình duyệt không hỗ trợ trình giữ chỗ đầu vào, bạn có thể sử dụng plugin jQuery có tên jQuery HTML5 Placeholder , sau đó chỉ cần thêm mã JavaScript sau để bật.

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

@Duke, nó hoạt động trong Fx3.7 +, (Safari / Chrome) và Opera. IE9 không hỗ trợ nó, vì vậy tôi đoán IE8 cũng không.
Alessandro Vermeulen

Có, tôi mới phát hiện ra rằng FF3.6 không hỗ trợ nó.
Drew Noakes

Tôi nghĩ rằng nó đã di chuyển một lần nữa. Tôi tìm thấy nó ở đây: github.com/mathiasbynens/jquery-placeholder
jocull

Nhà phát triển Caveat "Internet Explorer 10 và 11 không hiển thị trình giữ chỗ khi trường được tập trung, ngay cả khi trường trống."
Đại tá Panic

92

Điều đó được gọi là hình mờ hộp văn bản và được thực hiện thông qua JavaScript.

hoặc nếu bạn sử dụng jQuery, một cách tiếp cận tốt hơn nhiều:


4
Liên kết thứ hai đó bị hỏng. Điều này có thể tương tự: digitalbush.com/projects/watermark-input-plugin
Michael Haren

14
Tìm thấy một cách tiếp cận jQuery khác. dự án này được lưu trữ @ code.google.com/p/jquery-watermark
JP Hellemons

4
Plugin kỹ thuật số sẽ lưu 'hình mờ' vào cơ sở dữ liệu. Đây là bản beta và chưa được cập nhật kể từ năm 2007. Thay vào đó, tôi khuyên bạn nên sử dụng code.google.com/p/jquery-watermark như @JP đề xuất.
Kimball Robinson

1
Tôi nghĩ rằng tác giả của câu hỏi nên quay lại và đánh dấu bình luận @JP là câu trả lời tốt nhất.
Randy L

2
Plugin watermark của jQuery khá noob vì nó không xử lý trường hợp đầu vào giống với giá trị được điền sẵn. Trong trường hợp đó, nó làm cho văn bản đầu vào của bạn màu xám trở lại!
atp

41

Bạn có thể đặt giữ chỗ bằng cách sử dụng placeholderthuộc tính trong HTML ( hỗ trợ trình duyệt ). Các font-stylecolorcó thể được thay đổi với CSS (mặc dù hỗ trợ trình duyệt được giới hạn).

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


Đã tìm kiếm điều này, ta - thông tin thêm diveintohtml5.org/forms.html#placeholder
David Yell

2
Điều này bây giờ nên là câu trả lời được chấp nhận. Thuộc tính giữ chỗ có thể không được hỗ trợ rộng rãi khi điều này ban đầu được đăng vào năm 2010, nhưng bây giờ nó được hỗ trợ bởi tất cả các trình duyệt hiện tại trừ IE8.
JSP64

20

Bạn có thể thêm và xóa một lớp CSS đặc biệt và sửa đổi giá trị đầu vào onfocus/ onblurbằng 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...'; }">

Sau đó, chỉ định một lớp gợi ý với kiểu dáng bạn muốn trong CSS của bạn, ví dụ:

input.hint {
    color: grey;
}

2
Tôi đã đăng một câu trả lời cũng làm điều tương tự nhưng theo cách thuận tiện và dễ bảo trì hơn: stackoverflow.com/questions/108207/iêu
Drew Noakes No

6

Cách tốt nhất là kết nối các sự kiện JavaScript của bạn bằng cách sử dụng một số loại thư viện JavaScript như jQuery hoặc YUI và đặt mã của bạn vào tệp .js bên ngoài.

Nhưng nếu bạn muốn một giải pháp nhanh và bẩn thì đây là giải pháp HTML nội tuyến của bạn:

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

Cập nhật : Đã thêm các công cụ tô màu được yêu cầu.


Điều này là ổn đối với các tìm kiếm, nhưng trong nhiều trường hợp, bạn không muốn hình mờ được gửi trong bất kỳ sự kiện gửi nào.
Kimball Robinson

@ k.robinson Tôi +1 câu nói đó. Đây là mã nhanh nhất và nhỏ gọn nhất tại thời điểm đó. Nó có thể được giải quyết chi tiết hơn với khối mã javascript.
Seb Nilsson

4

Tôi đã đăng một giải pháp cho điều này trên trang web của tôi một thời gian trước đây. Để sử dụng nó, hãy nhập một .jstệp duy nhất :

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

Sau đó chú thích bất kỳ đầu vào nào bạn muốn có gợi ý với lớp CSS hintTextbox:

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

Thêm thông tin và ví dụ có sẵn ở đây .


1
Nhưng nó bị hỏng. Nếu tôi nhập cùng một văn bản là gợi ý, nó sẽ hoạt động như thể không có đầu vào nào được đưa ra (nếu tôi nhập vào rồi lại ra khỏi nó)
Stephan Eggermont

2
@Stephan: Vâng, đó là lời cảnh báo duy nhất tôi biết. Bạn đã thực sự thấy rằng đó là một vấn đề trong thực tế? Nếu vậy thì bạn có thể phải điều tra phân lớp một div ở trên và hiển thị / ẩn nó. Đây là giải pháp đơn giản nhất mà tôi biết. Tôi cũng xuống cấp độc đáo nếu JavaScript bị vô hiệu hóa.
Drew Noakes

Tôi đã được kích hoạt bởi các thiết lập của giá trị. Tôi có nhu cầu kết hợp điền trước với giá trị hiện có hoặc mặc định và một gợi ý khi hộp văn bản trống
Stephan Eggermont

@Stephan - Hôm nay tôi thực sự bắt gặp nhu cầu về điều này và đang xem xét các plugin jQuery. Câu hỏi được liên kết đến trong câu trả lời được chấp nhận chịu cùng một vấn đề của tôi. Bạn có biết về một sự thay thế?
vẽ Noakes

3

Đây là một ví dụ chức năng với bộ đệm thư viện Google Ajax và một số phép thuật jQuery.

Đây sẽ là CSS:

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

Đây sẽ là mã 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>

Và đây sẽ 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>

Tôi hy vọng nó đủ để khiến bạn quan tâm đến cả GAJAXLib và jQuery.




2

Tôi thấy plugin jQuery Watermark tốt hơn cái được liệt kê trong câu trả lời hàng đầu. Tại sao tốt hơn? Bởi vì nó hỗ trợ các trường nhập mật khẩu. Ngoài ra, việc đặt màu của hình mờ (hoặc các thuộc tính khác) cũng dễ như tạo .watermarktham chiếu trong tệp CSS của bạn.


2

Điều này được gọi là "hình mờ".

Tôi tìm thấy plugin jQuery hình mờ jQuery , không giống như câu trả lời đầu tiên, không yêu cầu thiết lập thêm (câu trả lời ban đầu cũng cần một cuộc gọi đặc biệt trước khi gửi biểu mẫu).


2

Sử dụng Trình thông báo biểu mẫu jQuery - đây là một trong những trình cắm jQuery phổ biến nhất và không gặp phải lỗi mà một số đề xuất jQuery khác ở đây thực hiện (ví dụ: bạn có thể tự do tạo kiểu hình mờ, mà không lo lắng liệu nó có được lưu vào cơ sở dữ liệu).

jQuery Watermark sử dụng một kiểu CSS trực tiếp trên các thành phần của biểu mẫu (Tôi nhận thấy rằng các thuộc tính kích thước phông chữ CSS được áp dụng cho hình mờ cũng ảnh hưởng đến các hộp văn bản - không phải là điều tôi muốn). Điểm cộng với jQuery Watermark là bạn có thể kéo thả văn bản vào các trường (Trình thông báo biểu mẫu jQuery không cho phép điều này).

Một số khác được đề xuất bởi một số người khác (một trong số tại digitalbrush.com), sẽ vô tình gửi giá trị hình mờ vào biểu mẫu của bạn, vì vậy tôi thực sự khuyên bạn nên chống lại nó.


1

Sử dụng hình nền để hiển thị văn bản:

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

Sau đó, tất cả những gì bạn phải làm là phát hiện value == 0và áp dụng đúng lớp:

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

Và mã JavaScript jQuery trông như thế này:

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

1

Bạn có thể dễ dàng có một hộp đọc "Tìm kiếm" sau đó khi tiêu điểm được thay đổi thành nó sẽ xóa văn bản. Một cái gì đó như thế này:

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

Tất nhiên, nếu bạn làm điều đó, văn bản của chính người dùng sẽ biến mất khi họ nhấp vào. Vì vậy, bạn có thể muốn sử dụng một cái gì đó mạnh mẽ hơn:

<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

Khi trang tải lần đầu tiên, Tìm kiếm sẽ xuất hiện trong hộp văn bản, màu xám nếu bạn muốn.

Khi hộp nhập nhận được tiêu điểm, chọn tất cả văn bản trong hộp tìm kiếm để người dùng có thể bắt đầu nhập, sẽ xóa văn bản đã chọn trong quy trình. Điều này cũng sẽ hoạt động tốt nếu người dùng muốn sử dụng hộp tìm kiếm lần thứ hai vì họ sẽ không phải làm nổi bật văn bản trước đó để xóa nó.

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

0

Tôi thích giải pháp của "Chikuse kiến ​​thức" - đơn giản và rõ ràng. Chỉ cần thêm một cuộc gọi để làm mờ khi tải trang đã sẵn sàng sẽ đặt trạng thái ban đầu:

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

0

Bạn muốn chỉ định một cái gì đó như thế này để tập trung:

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

và điều này để onblur:

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

(Bạn có thể sử dụng một cái gì đó thông minh hơn một chút, như hàm khung, để thực hiện chuyển đổi tên lớp nếu bạn muốn.)

Với một số CSS như thế này:

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

0

Tôi đang sử dụng một giải pháp javascript đơn giản, một dòng hoạt động tuyệt vời. Dưới đây là một ví dụ cho cả textbox và 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'; }">

chỉ "nhược điểm" là xác thực ở mức $ _POST hoặc xác thực Javascript trước khi làm bất cứ điều gì với giá trị của trường. Có nghĩa là, kiểm tra xem giá trị của trường không phải là "Văn bản".


-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

Thẻ 'bắt buộc' đơn giản Html rất hữu ích.

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

Nó chỉ định rằng một trường đầu vào phải được điền trước khi gửi biểu mẫu hoặc nhấn nút gửi. Đây là ví dụ


Mặc dù nó hữu ích, nhưng nó không liên quan gì đến câu hỏi.
Quentin

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.