Недавно я просматривал решения jquery/javascript для эмуляции атрибута placeholder
, но ни одно из них, похоже, не подходит. Общие проблемы:
- Встроенная поддержка браузера не используется в первую очередь
- Форма может фактически публиковать значение текста-заполнителя.
- Невозможно распознать текст-заполнитель и ввод пользователя, если значения идентичны (Эй, мой адрес электронной почты: [email protected]!! Почему он не отправляется? Эй, я хотел найти строку «Поиск», но это не пускает!)
- Трудно стилизовать или отличить обычный текст от текста-заполнителя.
- Навязчивая реализация (почти всегда. Я не хочу добавлять 2 div на вход и таблицу стилей для этого)
- Просто не работает. По крайней мере, 2 из них на веб-сайте jQuery.
Я немного поиграл, пытаясь заставить это работать правильно (взяв несколько подсказок из кода, который я уже видел), но он все еще нуждается в доработке. В частности, форма может публиковать значение заполнителя. Комментарии и модификации jsfiddle приветствуются. (Примечание. Демонстрацию следует просматривать в браузере без поддержки заполнителей) Большинство кода, который я видел, принимает значение placeholder
и вставляет его в сам ввод, что приводит к этой проблеме, я чувствую, что там должен быть лучший способ.
Есть ли хорошее чистое решение, которое действительно работает?
РЕДАКТИРОВАТЬ: я хочу подчеркнуть это: он должен вести себя так, как вы видите его в браузерах, которые изначально поддерживают его в максимально возможной степени, и быть настолько ненавязчивым, насколько это возможно, как показано в моем текущем коде, который не требует ничего, кроме включения сценария и использования placeholder
, как обычно для браузеров, которые его поддерживают.
ОБНОВЛЕНИЕ: Текущее решение @DA - это несколько исправлений ошибок, далеких от совершенства (см. комментарии), хотелось бы, чтобы это собралось на 100% и позорило весь плохой и глючный код в сети.
ОБНОВЛЕНИЕ: это работает с парой модификаций кода DA, но все еще не идеально, в основном в отношении динамически добавляемых полей ввода и существующих привязок submit()
. Всем спасибо за помощь, я пока решил, что оно того не стоит. Я знаю несколько человек, которые обязательно воспользуются этим. Это хороший трюк, но для меня не стоит даже 1% вероятности того, что форма отправит что-то, для чего она не предназначена, или неправильно прочитает пользовательский ввод. Эта небольшая функция просто не стоит головной боли, IE и друзья могут просто справиться с ней, или ее можно реализовать в каждом конкретном случае, если она действительно нужна, например, если этого требует клиент. @DA еще раз спасибо, это лучшая реализация, которую я видел.
ЗАКЛЮЧЕНИЕ. Я думаю, что единственный способ решить все эти проблемы примерно так:
- Скопируйте значение заполнителя в новый элемент уровня блока
- Добавить новый элемент к входу
- Рассчитайте высоту границы и отступ ввода и переместите новый элемент поверх него как можно ближе к положению, в котором должен появиться текст.
- Используйте стандартные события размытия/изменения/фокуса, чтобы скрыть элемент, когда ввод имеет значение или сфокусирован
Таким образом, вам не нужно ничего делать при отправке или решать какие-либо другие проблемы, которые могут возникнуть. Извините, демо еще нет, мне нужно вернуться к работе, но я приберегу окончательное редактирование, когда все будет готово.
<div style="position:relative;"><span style="position:absolute;top:0px;left:0px;"/><input style="background:transparent;" /></div>
и установите для содержимого диапазона текст «заполнителя», когда ввод пуст. - person Mark Kahn   schedule 07.04.2011trigger()
событием фокуса? Мобильная разработка мне совершенно неизвестна, поэтому я уверен, что вы уже думали об этом. Кстати, я поместил ваш код в свою CMS, чтобы протестировать его, и именно здесь у меня возникли проблемы из-за различных других привязок отправки и элементов управления формой, созданных ajax, но распознавание пользовательского ввода действительно сработало. - person Wesley Murch   schedule 07.04.2011