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

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

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

с тех пор, как был задан вопрос, атрибут-заполнитель HTML5 стал поддерживаться всеми браузерами.

Jasen 20.08.2015 04:52

Привет Майкл. Вы бы хотели изменить принятый ответ на этой странице? Похоже, явный победитель отличается от принятого ответа.

null 08.09.2016 08:36

Проблема с решением JavaScript заключается в том, что не у всех включен JavaScript. Заполнитель не исчезает, когда текстовое поле получает фокус при использовании плагина браузера, такого как NoScript (очень удобно для установки разработчиками). Вариант заполнителя - самое надежное решение.

Sablefoste 22.03.2017 16:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
216
3
341 945
22
Перейти к ответу Данный вопрос помечен как решенный

Ответы 22

Вы можете добавить и удалить специальный класс 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;
}

Я опубликовал ответ, который делает то же самое, но более удобным и удобным в обслуживании способом: stackoverflow.com/questions/108207/…

Drew Noakes 08.06.2010 09:10

Вы можете легко сделать поле с надписью «Поиск», а затем, когда фокус будет изменен на него, текст будет удален. Что-то вроде этого:

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

Лучший способ - связать ваши события 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'}" />

Обновлено: Добавлены запрошенные раскраски.

Это нормально для поиска, но во многих случаях вы не хотите, чтобы водяные знаки отправлялись при любом событии отправки.

Kimball Robinson 25.08.2010 22:28

@ k.robinson Я добавил +1 к этому заявлению. На тот момент это был самый быстрый и компактный код. Это можно было бы решить более детально с помощью блока кода javascript.

Seb Nilsson 26.08.2010 11:44

Используйте фоновое изображение для визуализации текста:

 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");
        }
    });
});

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

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;
}

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

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

Вторая ссылка не работает. Это может быть похоже: digitalbush.com/projects/watermark-input-plugin

Michael Haren 10.05.2009 21:11

Нашел другой подход jQuery. этот проект размещен на @ code.google.com/p/jquery-watermark

JP Hellemons 17.08.2010 17:19

Плагин digitalbrush сохранит «водяной знак» в базе данных. Он находится в стадии бета-тестирования и не обновлялся с 2007 года. Я рекомендую вместо этого использовать code.google.com/p/jquery-watermark, как предлагает @JP.

Kimball Robinson 25.08.2010 05:34

Я думаю, что автору вопроса следует вернуться и отметить комментарий @JP как лучший ответ.

Randy L 01.10.2010 03:22

Плагин водяных знаков jQuery довольно прост, потому что он не обрабатывает случай, когда ввод совпадает с предварительно заполненным значением. В этом случае он снова делает ваш вводимый текст серым!

atp 27.10.2010 05:38

@Jasie - Я не думаю, что многие люди будут вводить "введите текст" или что-то в этом роде, и если они это сделают, было бы легко поймать это, если бы вы действительно беспокоились об этом ...?

naspinski 27.10.2010 06:29

Я думаю, но тогда вам придется писать код поверх плагина, который должен помочь вам не писать код :)

atp 27.10.2010 21:23

@Jasie: в нем упоминается, что в readme - простое исправление - просто добавить кучу пробелов в конец текста водяного знака

ajbeaven 31.10.2011 03:07

Кроме того, плагин digitalbush не обрабатывает ввод пароля. Вместо пароля отображается ******

erdomester 11.02.2014 19:04

современный способ сделать это - использовать атрибут-заполнитель html5, javascript вообще не нужен.

Jasen 21.08.2015 03:55

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

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

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

Вот функциональный пример с кешем библиотеки 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>

Надеюсь, этого достаточно, чтобы заинтересовать как библиотеки GAJAXLib, так и jQuery.

Пользователь AJAXToolkit из http://asp.net

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

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

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

Anirvan 13.10.2010 03:58

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

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

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

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

Некоторое время назад я отправил решение для этого на моем веб-сайте. Чтобы использовать его, импортируйте один файл .js:

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

Затем аннотируйте любые входные данные, для которых вы хотите иметь подсказки, с помощью класса CSS hintTextbox:

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

Дополнительная информация и примеры доступны здесь.

Но он сломан. Если я ввожу тот же текст, который был подсказкой, он ведет себя так, как если бы ввод не был введен (если я снова перейду к нему, а затем выйду из него)

Stephan Eggermont 10.08.2010 23:23

@ Стефан: Да, это единственное предостережение, о котором я знаю. Вы действительно обнаружили, что это проблема на практике? Если это так, то вам, возможно, придется исследовать наслоение div выше и его отображение / скрытие. Это самое простое из известных мне решений. Я также хорошо деградирую, если отключен JavaScript.

Drew Noakes 11.08.2010 02:35

Меня спровоцировала установка значения. У меня есть комбинированная потребность в предварительном заполнении существующим значением или значением по умолчанию и подсказкой, когда текстовое поле пусто

Stephan Eggermont 11.08.2010 11:46

@Stephan - Сегодня я действительно столкнулся с необходимостью в этом и смотрю на плагины jQuery. Тот, на который ссылается в принятом ответе, страдает той же проблемой, что и моя. Вы знаете альтернативу?

Drew Noakes 23.08.2010 00:51

Вы можете установить заполнитель, используя Атрибут 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">

Искал вот это, та - подробнее diveintohtml5.org/forms.html#placeholder

David Yell 15.10.2010 13:36

Теперь это должен быть принятый ответ. Атрибут placeholder, возможно, не получил широкой поддержки, когда он был первоначально опубликован в 2010 году, но теперь он поддерживается всеми текущими браузерами, кроме IE8.

JSP64 09.06.2015 04:37

Используйте jQuery Form Notifier - это один из самых популярных плагинов jQuery, и он не страдает ошибками, которые есть у некоторых других предложений jQuery здесь (например, вы можете свободно стилизовать водяной знак, не беспокоясь о том, будет ли он сохранен в базе данных) .

Водяной знак jQuery использует один стиль CSS непосредственно в элементах формы (я заметил, что свойства размера шрифта CSS, примененные к водяному знаку, также влияют на текстовые поля, а не на то, что я хотел). Плюс jQuery Watermark в том, что вы можете перетаскивать текст в поля (jQuery Form Notifier не позволяет этого).

Другой, предложенный некоторыми другими (на digitalbrush.com), случайно отправит значение водяного знака в вашу форму, поэтому я настоятельно не рекомендую это делать.

Ответ принят как подходящий

Другой вариант, если вы счастливы иметь эту функцию только для новых браузеров, - это использовать поддержку, предлагаемую атрибутом заполнитель 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 тоже не поддерживает.

Alessandro Vermeulen 08.05.2011 15:09

Да, я только что узнал сегодня, что FF3.6 его не поддерживает.

Drew Noakes 08.05.2011 21:57

Я думаю, он снова переехал. Нашел здесь: github.com/mathiasbynens/jquery-placeholder

jocull 13.02.2013 19:03

Предупреждение разработчика: «Internet Explorer 10 и 11 не показывают заполнитель, когда поле сфокусировано, даже если поле пустое».

Colonel Panic 13.01.2015 20:00

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

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

Полезен простой тег HTML "required".

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

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

Хотя это полезно, это не имеет отношения к вопросу.

Quentin 27.09.2017 14:35

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

например

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

проверьте подробности: http://www.w3schools.com/tags/att_input_placeholder.asp

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


Вы можете использовать атрибут placeholder = "". Вот демонстрация:

<html>
<body>
// try this out!
<input placeholder = "This is my placeholder"/>
</body>
</html>

Другие вопросы по теме