Как обойти стандартное поведение blur?
Есть текстовое поле, смысл в том, что когда курсор выходит из него забираются данные из поля и отправляются на сервер. Задача не сложная. Но если для ее решения использовать событие blur или focusout получается, что обработчик срабатывает и тогда, когда пользователь хочет переключиться между вкладками в браузере и когда пользователь захочет переключиться между приложениями в ОС.
Как обойти такое поведение? Т.е. необходимо, чтобы обработчик blur срабатывал только когда пропадал фокус в пределах текущего окна браузера. Заранее благодарен. |
Видимо придеться слушать blur у window, ставить флаг, когда событие зажигается и в обработчике блюра поля смотреть, если данный флаг или нет. Проблема в том, что у поля событие должно зажечься раньше, чем у окна. Соответственно, скорее всего, придется использовать setTimeout(func, 0);
|
blur окна это сферический конь в вакууме. Нет, как-то добиваются, во-первых сразу не через JS, а сугубо через DOM (onblur), во-вторых все равно не пашет.
|
Я бы предложил ТСу не вести себя так, чтобы приходилось обходить нормальный контекст. Однако логика потери фокуса элемента интерфейса заключается в получении фокуса другим элементом. Следовательно если после потери проверить находки и найдутся - значит в пределах документа, иначе - убежал.
Кстати, @#%$%&ий ёкзель меня систематически достает этой своей фишкой - отключение подсветки выделенных строк при потере фокуса окном. Какой-то дебил в МС работал в одном окне и подумал а зачем юзеру два рядом? |
Цитата:
|
А, блин, точно, это же не десктоп. Ну значит облом.
Нет, блин, надо проверить - на тело повесить щелчок и посмотреть доплывет до него фокус или нет. |
Цитата:
Цитата:
|
Цитата:
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> |
Круто, работает! Признаю свой бред.
И кажется я понял как он зародился. Ничтоже сумняще я повесил на размытие функцию console.log('blur') и сделав подвал браузера видимым начал переключаться между окнами. Х нанэ, не размывалось. Потащился в инет читать - там понаписано, короче, думаю, не суждено. Оказывается консоль браузера - это отдельное окно. Когда оно активно то в клиенте уже никакого размытия не будет. Его и не было. Спасибо. |
Часовой пояс GMT +3, время: 12:46. |