Оптимизация очистки инпутов.
Здравствуйте. Теоретически часть задачи сводится к следующему.
Если инпут заполнен стандартным значением, то очищать при фокусе, если пустой, то заполнять стандартным значением при потере фокуса. Тут все просто: var startSubject = $('#contact-form__subject').val(); var startEmail = $('#contact-form__email').val(); var startMessage = $('#contact-form__message').val(); $('#contact-form__subject').focus(function() { if ($(this).val() == startSubject) { $(this).attr({value: ''}); $(this).addClass('active-input'); } }); $('#contact-form__subject').focusout(function(){ if ($(this).val() == '') { $(this).attr({value: startSubject}); $(this).removeClass('active-input'); } }); Но у меня несколько полей инпут в которых стандартное значение различается. Подскажите, пожалуйста, как оптимизировать процесс, чтобы для любого из инпутов для которых происходит фокус или его снятие выполнялась суть задачи. |
переписать ток под jquery.. кода будет меньше :)
заметил фигню у IE 'placeholder' in input ошибок не выдает,а на этом месте спотыкается.. странно... но стоило поставить это : 'placeholder' in document.createElement('input'); как он всё проглотил :) и работает ,как задумывалось код снизу проверял в ie8 <input id="a" value="" placeholder="Введите свой email..."> <script> // наше текстовое поле var input = document.getElementById("a"); // поддержка placeholder var supported = 'placeholder' in document.createElement('input'); if(!supported) { // значение по-умолчанию var defvalue = input.getAttribute('placeholder'); //или аттач от jquery input.onfocus = input.onblur = function(e){ if (!e) e = window.event; if( e.type === 'focus' ){ // если поле заполнено знач. по умолч., то очищаем if( input.value === defvalue ) input.value=''; } else { // если поле пустое, заполняем знач по умолч if( input.value.length === 0 ) input.value = defvalue; } return; } // и заполняем значением по умолчанию, если надо input.onfocus( {type:'blur'} ) } </script> |
Цитата:
|
У меня есть свой логический вариант, но как его реализовать я не знаю и возможно ли это вообще. Если кто подскажет, что к чему, то буду очень рад.
В общем у меня есть инпуты с айдишники contact-form__subject, contact-form__email и contact-form__message. У каждого из этих инпутов я беру value и вкладываю их в переменную, соответственно startSubject, startEmail, startMessage (это я делаю в любом случае, для еще кое-каких нужд). В результате для одного такого инпута получается код: $('#contact-form__subject').focus(function() { if ($(this).val() == startSubject) { $(this).attr({value: ''}); $(this).addClass('active-input'); } }); Таким образом, чтобы сравнивать value старых и новых элементов мне нужно заменять только $('#contact-form__subject') на нужный мне айдишник инпута и все будет хорошо, кроме одного: if ($(this).val() == startSubject) Мне еще нужно преобразовать переменную, в данном случае нужно взять start от название переменной и слово после __ у каждого айдишника. Получается, что-то вроде: if ($(this).val() == 'start' + 'как-то получить это значение после __') // И еще преобразовать полученную сумму строк в переменную. Потом из этого сделать функцию в которую просто передавать айдишник поля по которому совершен клик. |
Не надо сравнивать value. Нужно label с нужной надписью спозиционировать над инпутом и в нужные моменты времени его показывать/скрывать.
|
Цитата:
Задачу пока решил написанием функции, в которую просто кидаю переменные. Получилось конечно все равно к каждому инпуту свой запрос, но в одну строчку. |
разберись в том , что я тебе написал.разве это не подошло?
|
Цитата:
|
Цитата:
|
doniv, если рассматривать только новые браузеры - можно использовать возможности хтмл5
<input type='text' placeholder='Значение по умолчанию' /> |
Цитата:
Спасибо. |
Все получилось. Кроме одного, я вспомнил, что и с техареа нужно поступать подобным образом. Немного покумекал и вот финальный код:
<form method="post" action="contactform.php" id="contact-form"> <ul class="contact-form__list"> <li> <label class="contact-form__label" for="contact-form__subject">Тема</label> <input class="contact-form__list__item" type="text" name="name" value="Тема" id="contact-form__subject" /> </li> <li> <label class="contact-form__label" for="contact-form__email">Ваша электропочта</label> <input class="contact-form__list__item" type="text" name="email" value="Ваша электропочта" id="contact-form__email" /> </li> <li> <label class="contact-form__label" for="contact-form__message">Текст сообщения</label> <textarea class="contact-form__list__item-text" rows="5" name="message" id="contact-form__message">Текст сообщения</textarea> </li> <li> <input type="submit" id="contact-form__submit" class="contact-form__list__item-button" value="Отправить" /> </li> </ul> </form> //Очищаем и заполняем элементы формы по клику function textForm(inputId){ if (inputId.val() == inputId.parent().find('label').html()) { //Если в инпуте значение по умолчанию, то очищаем inputId.attr({value: ''}); inputId.addClass('active-input'); } else { if (inputId.val() == '') { //Если инпут пустой, то заполняем его значение по умолчанию inputId.attr({value: inputId.parent().find('label').html()}); inputId.removeClass('active-input'); } } } //Применяем функцию на нужные поля $('.contact-form__list').find('label + *').live('click', function() {textForm($(this));}); $('.contact-form__list').find('label + *').focusout(function(){textForm($(this));}); Большое спасибо всем участникам. |
Появился дополнительный вопрос.
Когда я вызываю функцию, через фокус $('li').find('label + *').focus(function() {clearField($(this));}); а не через клик $('li').find('label + *').live('click', function() {clearField($(this));}); То она начинает срабатывать бесконечно. А мне нужно вызывать ее именно через фокус, чтобы весь код срабатывал при переключения с помощью таба. В чем тут проблема и как ее решить? P.S.clearField это таже самая textForm из предыдущего сообщения. |
Часовой пояс GMT +3, время: 02:25. |