Как сделать, чтобы текстовое поле HTML показывало подсказку, когда пусто?

210

Я хочу, чтобы в окне поиска на моей веб-странице слово «Поиск» отображалось серым курсивом. Когда поле получает фокус, оно должно выглядеть как пустое текстовое поле. Если в нем уже есть текст, текст должен отображаться нормально (черный, не курсив). Это поможет мне избежать беспорядка, удалив этикетку.

Кстати, это поиск Ajax на странице , поэтому он не имеет кнопки.

Майкл Л Перри
источник
4
с тех пор как вопрос был задан, атрибут-заполнитель HTML5 стал поддерживаться всеми браузерами.
Ясен
Привет майкл Хотели бы вы изменить принятый ответ на этой странице? Там, кажется, явный победитель, который отличается от принятого ответа.
ноль
Проблема с решением JavaScript состоит в том, что не у всех включен JavaScript. Заполнитель не исчезает, когда текстовое поле получает фокус, если используется плагин для браузера, такой как NoScript (очень удобно для установки разработчиками). Опция Placeholder является наиболее надежным решением.
Sablefoste

Ответы:

365

Другой вариант, если вы хотите использовать эту функцию только для новых браузеров, это использовать поддержку, предлагаемую атрибутом placeholder HTML 5 :

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

В отсутствие каких-либо стилей в Chrome это выглядит так:

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

Вы можете попробовать демо здесь и в HTML5 Placeholder Styling с помощью 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
Предостережение разработчика: «Internet Explorer 10 и 11 не показывают заполнитель, когда поле сфокусировано, даже если поле пустое».
полковник Паник
92

Это известно как водяной знак текстового поля, и это делается с помощью JavaScript.

или, если вы используете JQuery, гораздо лучший подход:

naspinski
источник
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 довольно нубский, потому что он не обрабатывает случай, когда ввод совпадает с предварительно заполненным значением. В этом случае, ваш текст снова станет серым!
АТП
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">

0b10011
источник
Искал
Дэвид Йелл
2
Теперь это должен быть принятый ответ. Атрибут placeholder, возможно, не был широко поддержан, когда он был впервые опубликован в 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.
Себ Нильссон
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
@ Стефан: Да, это единственное предупреждение, о котором я знаю. Вы на самом деле обнаружили, что это проблема на практике? Если это так, то вам, возможно, придется изучить наложение деления выше и показать / скрыть его. Это самое простое из известных мне решений. Я также приятно ухудшается, если JavaScript отключен.
Дрю Ноакс
Я был вызван установкой значения. Мне нужно предварительно заполнить существующее значение или значение по умолчанию и подсказку, когда текстовое поле пусто
Стефан Эггермонт
@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.

Густаво Каррено
источник
3

Теперь это стало очень легко. В html мы можем дать атрибут placeholder для элементов ввода .

например

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

проверьте более подробную информацию: http://www.w3schools.com/tags/att_input_placeholder.asp

APM
источник
2

Для пользователей jQuery: ссылка jQuery от naspinski не работает, но попробуйте это: http://remysharp.com/2007/01/25/jquery-tutorial-text-box-hints/

В качестве бонуса вы получаете бесплатное руководство по плагину jQuery. :)

tuomassalo
источник
Я использую плагин Реми на tripfootprint.com, и он прекрасно работает; Мне нравится, что это достаточно просто, чтобы следовать и унывать.
Анирван
2

Я нашел плагин jQuery jQuery Watermark лучше, чем тот, который указан в верхнем ответе. Почему лучше? Потому что он поддерживает поля ввода пароля. Кроме того, установить цвет водяного знака (или других атрибутов) так же просто, как создать .watermarkссылку в файле CSS.

Dustin
источник
2

Это называется "водяной знак".

Я нашел плагин jQuery для водяного знака jQuery, который, в отличие от первого ответа, не требует дополнительной настройки (исходный ответ также требует специального вызова перед отправкой формы).

elcuco
источник
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">
JH_
источник
0

Когда страница загружается впервые, в текстовом поле появится Поиск, серого цвета, если вы этого хотите.

Когда поле ввода получает фокус, выделите весь текст в окне поиска, чтобы пользователь мог просто начать печатать, что приведет к удалению выделенного текста в процессе. Это также будет хорошо работать, если пользователь захочет использовать окно поиска во второй раз, поскольку ему не придется вручную выделять предыдущий текст, чтобы удалить его.

<input type="text" value="Search" onfocus="this.select();" />
17 из 26
источник
0

Мне нравится решение "Знания Chikuse" - просто и понятно. Нужно добавить вызов размытия, когда загрузка страницы будет готова, что установит начальное состояние:

$('input[value="text"]').blur();
Исаак Лю
источник
0

Вы хотите назначить что-то вроде этого для onfocus:

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

а это на онблур

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

(Вы можете использовать что-то более умное, например, функцию фреймворка, чтобы переключать имена классов, если хотите.)

С некоторыми CSS, как это:

input.placeholder{
    color: gray;
    font-style: italic;
}
Дэн
источник
0

Я использую простое однострочное решение JavaScript, которое прекрасно работает. Вот пример как для текстового поля, так и для текстовой области:

    <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 для проверки, прежде чем делать что-либо со значением поля. Это означает, что значение поля не «Текст».

Kosem
источник
-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>

Он указывает, что поле ввода должно быть заполнено перед отправкой формы или нажатием кнопки «Отправить». Вот пример

Прадип
источник
Хотя это полезно, оно не имеет ничего общего с вопросом.
Квентин