Як зробити так, щоб текстове поле HTML відображало підказку, коли вона порожня?


210

Я хочу, щоб у вікні пошуку на моїй веб-сторінці відображалося слово "Пошук" сірим курсивом. Коли поле отримує фокус, воно повинно виглядати як порожнє текстове поле. Якщо в ньому вже є текст, він повинен відображати текст нормально (чорний, не курсив). Це допоможе мені уникнути захаращення, видаливши етикетку.

До речі, це веб- пошук в Ajax , тому в ньому немає жодної кнопки.


4
оскільки запитання було задано, атрибут HTML5 заповнення заповнений всіма браузерами.
Ясен

Привіт, Майкл. Чи бажаєте ви змінити прийняту відповідь на цій сторінці? Виглядає чіткий переможець, який відрізняється від прийнятої відповіді.
null

Проблема рішення JavaScript полягає в тому, що не у всіх увімкнено JavaScript. Замісник місця не зникає, коли текстове поле зосереджується, якщо використовується плагін браузера, наприклад NoScript (дуже зручно для встановлених розробників). Варіант Placeholder - це найбільш надійне рішення.
Sablefoste

Відповіді:


365

Інший варіант, якщо ви раді використовувати цю функцію лише для нових браузерів, - це використовувати підтримку, запропоновану атрибутом заповнення HTML 5 :

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

За відсутності будь-яких стилів у Chrome це виглядає так:

введіть тут опис зображення

Ви можете спробувати демонстрації тут і в стилі заповнення заповнення HTML5 за допомогою CSS .

Обов’язково перевірте сумісність браузера з цією функцією . Підтримка Firefox була додана в 3,7. Хром добре. Internet Explorer додав підтримку лише у 10. Якщо ви орієнтуєтесь на веб-переглядач, який не підтримує вхідні заповнювачі, ви можете використовувати плагін jQuery під назвою JQuery HTML5 Placeholder , а потім просто додати наступний код JavaScript, щоб увімкнути його.

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

@Duke, він працює у Fx3.7 +, (Safari / Chrome) та Opera. IE9 не підтримує його, тому, мабуть, IE8 теж не підтримує.
Алессандро Вермеулен

Так, я щойно з’ясував, що FF3.6 не підтримує його.
Дрю Ноакс

Я думаю, що знову зрушено. Я знайшов це тут: github.com/mathiasbynens/jquery-placeholder
Jocull

Розробник Caveat "Internet Explorer 10 і 11 не показує заповнювач, коли поле зосереджене, навіть якщо поле порожнє".
Полковник Паніка

92

Це відоме як водяний знак textbox, і це робиться через JavaScript.

або якщо ви використовуєте jQuery, набагато кращий підхід:


4
Ця друга ланка розірвана. Це може бути подібне: digitalbush.com/projects/watermark-input-plugin
Майкл Харен

14
Знайшов інший підхід jQuery. цей проект розміщено @ code.google.com/p/jquery-watermark
JP Hellemons

4
Плагін Digitalbrush збереже «водяний знак» у базі даних. Він знаходиться в бета-версії, і не оновлювався з 2007 року. Я рекомендую натомість використовувати code.google.com/p/jquery-watermark, як @JP запропонував.
Кімбол Робінсон

1
Я думаю, що автор питання повинен повернутися і позначити коментар @JP як найкращу відповідь.
Ренді Л

2
Плагін jQuery водяних знаків є досить noob, тому що він не обробляє випадок, коли вхід такий же, як попередньо заповнене значення. У цьому випадку ваш текст введення тексту знову стає сірим!
вторник

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



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/…
Дрю Ноакс

6

Найкращий спосіб - підключити події JavaScript, використовуючи якусь бібліотеку JavaScript, наприклад jQuery або YUI, і ввести свій код у зовнішній .js-файл.

Але якщо ви хочете швидко і забруднити рішення, це ваше вбудоване 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'}" />

Оновлено : додано запитувані фарбувальні матеріали.


Для пошуків це нормально, але в багатьох випадках ви не бажаєте, щоб водні знаки надсилалися на будь-яку подію подання.
Кімбол Робінсон

@ k.robinson Я поставив +1 цьому твердженню. Це був найшвидший і компактний код на той момент. Це можна вирішити більш дрібнозернистим кодом javascript-коду.
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
Але це порушено. Якщо я ввожу той самий текст, що був натяком, він поводиться так, ніби не було введено жодного вводу (якщо я вкладу, а потім знову з нього)
Стефан Еггермонт

2
@Stephan: Так, це єдиний застереження, про яке я знаю. Ви насправді виявили це на практиці? Якщо так, то, можливо, вам доведеться розслідувати шари діва вище та відобразити / приховати його. Це найпростіше рішення, про яке я знаю. Я також добре деградує, якщо JavaScript відключений.
Дрю Ноакс

Мене викликало встановлення значення. У мене є комбінована потреба попереднього заповнення наявним або типовим значенням та підказкою, коли текстове поле порожнє
Stephan Eggermont

@Stephan - Я сьогодні насправді натрапив на потребу в цьому і переглядаю плагіни jQuery. Той, хто пов'язаний у прийнятій відповіді, страждає від тієї ж проблеми, що і моя. Чи знаєте ви альтернативу?
Дрю Ноакс

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.



2

Для користувачів jQuery: посилання jQuery naspinski здається порушеним, але спробуйте це: http://remysharp.com/2007/01/25/jquery-tutorial-text-box-hints/

Ви отримуєте безкоштовний підручник для плагінів jQuery як бонус. :)


Я використовую плагін Remy на tripfootprint.com, і він чудово працює; Мені подобається, що це досить просто, щоб слідкувати за собою і крутити.
Анірван

2

Я знайшов плагін jQuery 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" />

І код JavaScript jQuery виглядає приблизно так:

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

Мені подобається рішення «Чикусе знань» - просте і зрозуміле. Необхідно додавати виклик для розмивання лише тоді, коли завантаження сторінки буде готове, що встановить початковий стан:

$('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>

Він визначає, що поле для введення повинно бути заповнене перед надсиланням форми або натиснути кнопку подати. Ось приклад


Хоча це корисно, воно не має нічого спільного з питанням.
Квентін

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.