Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   "не терять" фокус (https://javascript.ru/forum/events/55901-ne-teryat-fokus.html)

Prowler 19.05.2015 22:43

"не терять" фокус
 
Доброго времени суток!
Есть текстовое поле, допустим, "город", есть див ниже него в который подгружаются элементы для выбора, типа подсказок, для текстового поля. На форме есть и другие поля. После введения данных в поле "город" нужно проверить. На ум приходит только потеря фокуса, после чего осуществляем проверку.
Но, если щелкнуть по диву в котором подсказки, фокус с поля теряется и проверятся уходит то, что еще небыло до конца заполнено.
Может быть можно как то "обмануть" потерю фокуса? Звучит примерно так: если "город" потеряло фокус и активный элемент не див с подсказками отправляем данные на проверку.

krasovsky 20.05.2015 07:00

Чет ниче не понял. У тебя поле город это input? Так у инпута есть событие change которое и срабатывает как раз в этот момент.

ksa 20.05.2015 10:13

Цитата:

Сообщение от Prowler
После введения данных в поле "город" нужно проверить.

Предложение явно не закончено... :)

Можно еще нажатия кнопок отлавливать... С таймаутом... ;)

Prowler 20.05.2015 14:55

change почти то же самое - срабатывает при потере фокуса.
Попробую объяснить.
Есть поле input, есть div. Во время ввода в input в div подгружаются данные из которых пользователь может что-то выбрать и выбранное попадет в input. Как у яндекса и гугла в строке поиска. После того как пользователь ввел данные в Input нужно проверить их(отправляются на сервер). Т.е. пользователь может либо ввести данные в input с клавиатуры либо выбрать их из предложенных вариантов, отображенных в div. Как определить что пользователь закончил ввод данных в input? В голову приходит стандарное потеря фокуса. Но, если пользователь мышкой щелкнет по диву для того чтобы выбрать один из предложенных вариантов, поле input потеряет фокус и событие потери фокуса, что логично, произойдет раньше чем событие щелчка по диву. Т.е. данные из дива в input еще не попадут, но на проверку по событию потери фокуса уйдут, а в див попадут только после этого. Это вызовет ошибку.
Можно ли как то решить эту проблему? Надеюсь внятно написал в этот раз :)

ksa 20.05.2015 17:00

Цитата:

Сообщение от Prowler
Как определить что пользователь закончил ввод данных в input?

Это философский вопрос... :D На него на всякий пользователь может ответить, если его про то спросить.

Но если твой инпут сунуть в форму - можно ловить событие onsubmit... ;)

Prowler 20.05.2015 23:30

ksa,
Если бы было все так просто... нужно провести валидацию по этому полю раньше чем данные с формы уйдут на сервер. Есть тому причина...
Видимо решения вопроса не существует :(

krasovsky 21.05.2015 09:23

Цитата:

Сообщение от Prowler
Если бы было все так просто... нужно провести валидацию по этому полю раньше чем данные с формы уйдут на сервер. Есть тому причина...
Видимо решения вопроса не существует

Не придумывай. Твой лучший вариант - onsubmit. Есть такой волшебный метод addEventListener в js (или если ты пользуешь jq то .submit()) который навешивает обработчик onsubmit на форму, именно для того что бы ты мог это событие поймать, обработать(валидация твоя к примеру) и отменить отправку данных на сервер, если нужно.

Так вот не вилосипедь, создавай форму и индикацией "закончил ввод" пусть служить момент отправки формы.

ksa 21.05.2015 09:33

Цитата:

Сообщение от Prowler
нужно провести валидацию по этому полю раньше чем данные с формы уйдут на сервер

Событие onsubmit для того и существует... :D

kostyanet 22.05.2015 10:30

Цитата:

Сообщение от Prowler
Как определить что пользователь закончил ввод данных в input?

По нажатию кнопки "Я закончил ввод", которая может быть подписана ОК, Отправить, Сохранить, или не подписана вообще, то есть по ентеру.

kostyanet 22.05.2015 10:33

Цитата:

Сообщение от Prowler
нужно провести валидацию по этому полю раньше чем данные с формы уйдут на сервер

Можно и на валидацию повесить отгрузку. Как только проканала - ушло.


Часовой пояс GMT +3, время: 10:35.