Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как обойти стандартное поведение blur? (https://javascript.ru/forum/events/50434-kak-obojjti-standartnoe-povedenie-blur.html)

billi 26.09.2014 09:59

Как обойти стандартное поведение blur?
 
Есть текстовое поле, смысл в том, что когда курсор выходит из него забираются данные из поля и отправляются на сервер. Задача не сложная. Но если для ее решения использовать событие blur или focusout получается, что обработчик срабатывает и тогда, когда пользователь хочет переключиться между вкладками в браузере и когда пользователь захочет переключиться между приложениями в ОС.
Как обойти такое поведение? Т.е. необходимо, чтобы обработчик blur срабатывал только когда пропадал фокус в пределах текущего окна браузера.
Заранее благодарен.

WorM32 26.09.2014 10:14

Видимо придеться слушать blur у window, ставить флаг, когда событие зажигается и в обработчике блюра поля смотреть, если данный флаг или нет. Проблема в том, что у поля событие должно зажечься раньше, чем у окна. Соответственно, скорее всего, придется использовать setTimeout(func, 0);

kostyanet 26.09.2014 18:17

blur окна это сферический конь в вакууме. Нет, как-то добиваются, во-первых сразу не через JS, а сугубо через DOM (onblur), во-вторых все равно не пашет.

kostyanet 26.09.2014 18:21

Я бы предложил ТСу не вести себя так, чтобы приходилось обходить нормальный контекст. Однако логика потери фокуса элемента интерфейса заключается в получении фокуса другим элементом. Следовательно если после потери проверить находки и найдутся - значит в пределах документа, иначе - убежал.

Кстати, @#%$%&ий ёкзель меня систематически достает этой своей фишкой - отключение подсветки выделенных строк при потере фокуса окном. Какой-то дебил в МС работал в одном окне и подумал а зачем юзеру два рядом?

BETEPAH 26.09.2014 18:47

Цитата:

Сообщение от kostyanet
Однако логика потери фокуса элемента интерфейса заключается в получении фокуса другим элементом.

Разве? А если это был клик по div'у?

kostyanet 26.09.2014 18:51

А, блин, точно, это же не десктоп. Ну значит облом.

Нет, блин, надо проверить - на тело повесить щелчок и посмотреть доплывет до него фокус или нет.

WorM32 29.09.2014 10:21

Цитата:

Сообщение от kostyanet (Сообщение 332399)
blur окна это сферический конь в вакууме. Нет, как-то добиваются, во-первых сразу не через JS, а сугубо через DOM (onblur), во-вторых все равно не пашет.

Бред какой-то.

Цитата:

Сообщение от kostyanet (Сообщение 332409)
Нет, блин, надо проверить - на тело повесить щелчок и посмотреть доплывет до него фокус или нет.

Если фокусить нечего, фокус уходит на body всегда.

kostyanet 01.10.2014 05:46

Цитата:

Сообщение от WorM32
Бред какой-то.

Процитируйте не бред, типа там

window.addEventListener('blur',blah_blah);

чтобы blah_blah работала.

WorM32 01.10.2014 08:58

Цитата:

Сообщение от kostyanet (Сообщение 332909)
Процитируйте не бред, типа там

window.addEventListener('blur',blah_blah);

чтобы blah_blah работала.

<input type="text"><br />
    <span id="result"></span>
<script>
var result = document.getElementById('result');
document.getElementsByTagName('input')[0].addEventListener('blur', function () {
    result.innerHTML += 'input blur <br>';
}, true);

window.addEventListener('blur', function () {
    result.innerHTML += 'window blur <br>';
}, true);
</script>

kostyanet 01.10.2014 12:16

Круто, работает! Признаю свой бред.

И кажется я понял как он зародился. Ничтоже сумняще я повесил на размытие функцию console.log('blur') и сделав подвал браузера видимым начал переключаться между окнами. Х нанэ, не размывалось. Потащился в инет читать - там понаписано, короче, думаю, не суждено.

Оказывается консоль браузера - это отдельное окно. Когда оно активно то в клиенте уже никакого размытия не будет. Его и не было.

Спасибо.


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