Странный глюк с jQuery(document).ready() или не пойму с чем

12
Solmyr
На сайте с 10.09.2007
Offline
501
1350

Пытаюсь сделать так, чтобы в вебформе, в текстовом инпуте, если он пустой, поверх него отображалась надпись, а если не пустой - надписи не было. Вроде все просто. Как-то так:


jQuery('input').on('focus', function(){
jQuery('label[for='+jQuery(this).attr('id')+']').css('display','none');
});

jQuery('input').on('blur', function(){
if(jQuery(this).val()==''){
jQuery('label[for='+jQuery(this).attr('id')+']').css('display','block');
}
});

Нюанс в том, что открытии страницы с формой в браузере, некоторые поля формы могут быть сразу непустыми, т.к. автозаполнялка форм в браузере подставит тужа какие-то значения. Для этого делаем так:


jQuery(document).ready(function() {
jQuery('input').each(function(){
if(jQuery(this).val()!=''){
jQuery('label[for='+jQuery(this).attr('id')+']').css('display','none');
}
});
});

Сделал - и все ок. Работает. И тут вдруг мне пришло в голову, что на странице с формой, не нужно чтобы были посторонние скрипты вроде счетчиков. И я их убрал. И тут работать перестало. Получается, что в момент когда срабатывает jQuery(document).ready() автозаполнялка из браузера еще не заполнила поля формы - и там значения пока что пустые. Скрипты счетчиков как-то влияют на процесс, и когда они есть jQuery(document).ready() происходит позже, и к тому времени поля формы уже заполнены.

Интересно что:



function form_init(){
jQuery('input').each(function(){
if(jQuery(this).val()!=''){
jQuery('label[for='+jQuery(this).attr('id')+']').css('display','none');
}
});
}

jQuery(document).ready(function() {
setTimeout(form_init(), 1000);
});

Все равно не работает.

А вот так - работает:


jQuery(document).ready(function() {
alert('q');
jQuery('input').each(function(){
if(jQuery(this).val()!=''){
jQuery('label[for='+jQuery(this).attr('id')+']').css('display','none');
}
});
});

Пока закроешь алерт - все инициализировалось.

В общем вопрос, что делать?

---------- Добавлено 11.08.2015 в 13:10 ----------

P.S. Тестировал в Файрфокс и в Яндекс - одинаково.

LovelAss
На сайте с 05.06.2009
Offline
96
#1


setTimeout(form_init(), 1000);

Здесь скобки не нужны, иначе функция будет сразу исполняться.

А вообще, попробуйте перенести этот код в конец страницы, без использования таймаутов и document ready.

A
На сайте с 04.11.2007
Offline
134
#2

Solmyr, "автозаполнялка форм" это html5 form autocomplete="on"?

А не пробовали добавлять change с focus и blur? По логике, должно отработать.

... .on('focus change', function(){...

... .on('blur change', function(){...

Solmyr
На сайте с 10.09.2007
Offline
501
#3

asteroid, речь не про autocomplete, а про autofill. Там onchange не вызывает большинство браузеров.

LovelAss, Да, спасибо, верно, без скобок работает. Придется похоже делать так....

[Удален]
#4

Solmyr, может стоит не на jQuery(document).ready() ориентироваться, а на появление в dom конкретного input'а?

Solmyr:
Пытаюсь сделать так, чтобы в вебформе, в текстовом инпуте, если он пустой, поверх него отображалась надпись, а если не пустой - надписи не было

и чем вас атрибут placeholder у тега input не устраивает?

tommy-gung
На сайте с 22.11.2006
Offline
304
#5

load вместо ready использовать

Здесь не могла быть ваша реклама
Seredniy
На сайте с 17.03.2008
Offline
251
#6
burunduk:
и чем вас атрибут placeholder у тега input не устраивает?

Я вот тоже чет не въехал немного

Wordpress и другие CMS: правки, настройка, верстка и натяжка шаблонов, разработка сайтов "под ключ" (/ru/forum/1008050)
[Удален]
#7

Seredniy, видимо с дизайном заморочки

A
На сайте с 04.11.2007
Offline
134
#8

Solmyr, с Autofill народ на stackoverflow использует задержку setTimeout 200-250мс.

Если хотите заморочиться, то на гитхабе есть autofill-event с копирайтом гугла.

Solmyr
На сайте с 10.09.2007
Offline
501
#9
burunduk:
и чем вас атрибут placeholder у тега input не устраивает?

Я хочу чтобы надпись исчезала при получении фокуса, а не при вводе первой буквы.

asteroid:
Solmyr, с Autofill народ на stackoverflow использует задержку setTimeout 200-250мс.

Да, я так и сделал. У меня работает и со 100 но на всяк случай.

[Удален]
#10
Solmyr:
Я хочу чтобы надпись исчезала при получении фокуса, а не при вводе первой буквы.

форма заявки http://www.unmedia.ru/ такой эффект нужен?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий