onBlur в JS - как узнать кто получил фокус

12
[Удален]
3383

Сабж.

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

Как это сделать?

всевозможные target не помогают.

Да и вообще я весь объект event распечатал, никаких следов

malls
На сайте с 08.08.2005
Offline
255
#1
neolord:
Мне нужно чтобы при потере фокуса инпутом аяксом проверялась допустимость значения, но только в случае если юзер прямо из этого поля не щелкнул по одной определенной ссылке.

А как это - потеря фокуса - если не щелкнул по ссылке? Т.е. т.к. в INPUT ссылок запихать нельзя, то сл-но ссылки находятся вне инпута, значит любой клик по ним - это заведомо потеря фокуса инпутом.

Т.е. чего-то ТЗ хромает! :) Задача не понятна.

[Удален]
#2

да не, вы все правильно сказали.

но если он щелкнет по любой другой ссылке (стоя курсором в инпуте) кроме одной конкретной то пусть онблюр срабатывает как надо, а если именно по этой - то по сути надо отменить вызов функции

malls
На сайте с 08.08.2005
Offline
255
#3

Включаем перехват события onBlur - и вместо того чтобы оно сразу срабатывало - проверяем что юзер сделал после этого блюра. Т.е. если пошел по ссылкам - бог с ним, если клинкул на что-то нужное - включаем обработку onBlur-а.

Или я не понял?

neolord:
но если он щелкнет по любой другой ссылке (стоя курсором в инпуте)

он физически не может "кликнуть", одновременно "стоя курсором", как только он кликнул - "курсор" уже уехал - arrivederci...

т.к. браузер по умолчанию на onClick меняет Focus на другой элемент (на тот на который кликают), а смена фокуса это и есть onBlur, для предыдущего элемента имевшего фокус...

можно правда пробовать комбинировать onBlur и onClick как события... в принципе т.к. события разные - то должно сработать.

[Удален]
#4
malls:
Включаем перехват события onBlur - и вместо того чтобы оно сразу срабатывало - проверяем что юзер сделал после этого блюра. Т.е. если пошел по ссылкам - бог с ним, если клинкул на что-то нужное - включаем обработку onBlur-а.
Или я не понял?

поняли с точностью до наоборот. Если юзер кликнул по определенной одной ссылке - отменяем обработку, иначе пусть работает. Но вопрос как это связать, ведь blur неотменяемое событие. ввести глобальную переменную?


он физически не может "кликнуть", одновременно "стоя курсором", как только он кликнул - "курсор" уже уехал...

ну я это сказал к тому что вопрос не в перехвате просто клика по ссылке, а в перехвате клика по ссылке при потере фокуса определенным инпутом

malls
На сайте с 08.08.2005
Offline
255
#5
neolord:
поняли с точностью до наоборот. Если юзер кликнул по определенной одной ссылке - отменяем обработку, иначе пусть работает. Но вопрос как это связать, ведь blur неотменяемое событие. ввести глобальную переменную?

ну что "ввести" уже не важно - главное чтобы это был идентификатор потери фокуса именно нужным объектом, если не поймать это в нужный момент - то как потом узнать что фокус был именно на нем?

Потом если включить логику - то идея такая - если инпут получил фокус, значит на него кликнули мышом, значит мышь был на нем, значит на onMouseOut можно включить перехват captureEvents для этого инпута.

Т.е. если мышь пополз в сторону (кликать на ссылку) - мы уже ждем совершения блюра... Если он свершился одновременно с кликом на нужную ссылку - "велкам ту праздник жизни"

Правда это не решает проблемы если юзер табом ходит по форме, но таких мало, и можно отменить для инпута переход по табу.

aleksey_php
На сайте с 17.03.2008
Offline
53
#6

Можно попробовать такую логику:

Когда нужный инпут получил фокус (юзер начал что-то вводить) - переключаем глобальный флаг isInputFocused в true;

А необходимой ссылке в onClick прописываем функцию, которая работает так:

if(isInputFocused == true){

возвращаем фокус элементу нашего бедного инпута

}

Или я неправильно понял суть задачи?

[Удален]
#7

Блин, короче, чтоб было понятней.

Есть поле для ввода URL страницы. Юзер его вводит, и когда переключается на другой объект, урл автоматически проверяется на корректность (это сделано онблюром). И есть еще ссылка "сгенерировать урл". вот мне нужно чтобы если юзер ввел (или просто встал в поле) урл а потом кликнул по "сгенерировать урл", проверки не производилось, потому что ежу понятно что сгенерированный урл будет корректен.

ZZZubec
На сайте с 03.03.2009
Offline
1
#8

Есть вот такая идея, значит есть событие onExit="bla-bla-bla;"

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

malls
На сайте с 08.08.2005
Offline
255
#9

:) ежу другое не понятно? На чем экономим? на одном случайном запросе?

1. Т.е. если пользователь не ввел урл - то это отсекается в функции проверки? т.е.

if( .value) { только тогда и проверяем }

2. если он кликнул на любую ссылку кроме нужной - проверка так и так должна быть.

3. Если сразу кликнул на ссылку - то можно ввести нужный урл и заблокировать поле...

4. (и последний) если ввел урл или огрызок от него и кликнул на нужную ссылку - то осуществиться проверка этого огрызка (по onBlur), а потом подставится нужная ссылка.

получается что по ТЗ нужна защита только от случая 4. Но это в любом случае - максимум лишний запрос - в чем проблема то?

Если проблема все же есть - еще раз повторю - кури про перехват событий.

[Удален]
#10

поясняю насчет лишнего запроса.

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

Про перехват - имеется ввиду перехватывать onclick или табуляцию по форме?

12

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