Как сделать, чтобы текстовое поле 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, гораздо лучший подход:


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



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


2

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

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


Я использую плагин Реми на 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

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


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