26.09.2014, 09:59
|
Новичок на форуме
|
|
Регистрация: 25.09.2014
Сообщений: 1
|
|
Как обойти стандартное поведение blur?
Есть текстовое поле, смысл в том, что когда курсор выходит из него забираются данные из поля и отправляются на сервер. Задача не сложная. Но если для ее решения использовать событие blur или focusout получается, что обработчик срабатывает и тогда, когда пользователь хочет переключиться между вкладками в браузере и когда пользователь захочет переключиться между приложениями в ОС.
Как обойти такое поведение? Т.е. необходимо, чтобы обработчик blur срабатывал только когда пропадал фокус в пределах текущего окна браузера.
Заранее благодарен.
|
|
26.09.2014, 10:14
|
Профессор
|
|
Регистрация: 11.02.2014
Сообщений: 303
|
|
Видимо придеться слушать blur у window, ставить флаг, когда событие зажигается и в обработчике блюра поля смотреть, если данный флаг или нет. Проблема в том, что у поля событие должно зажечься раньше, чем у окна. Соответственно, скорее всего, придется использовать setTimeout(func, 0);
|
|
26.09.2014, 18:17
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
blur окна это сферический конь в вакууме. Нет, как-то добиваются, во-первых сразу не через JS, а сугубо через DOM (onblur), во-вторых все равно не пашет.
|
|
26.09.2014, 18:21
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Я бы предложил ТСу не вести себя так, чтобы приходилось обходить нормальный контекст. Однако логика потери фокуса элемента интерфейса заключается в получении фокуса другим элементом. Следовательно если после потери проверить находки и найдутся - значит в пределах документа, иначе - убежал.
Кстати, @#%$%&ий ёкзель меня систематически достает этой своей фишкой - отключение подсветки выделенных строк при потере фокуса окном. Какой-то дебил в МС работал в одном окне и подумал а зачем юзеру два рядом?
Последний раз редактировалось kostyanet, 26.09.2014 в 18:24.
|
|
26.09.2014, 18:47
|
|
Профессор
|
|
Регистрация: 23.06.2011
Сообщений: 1,165
|
|
Сообщение от kostyanet
|
Однако логика потери фокуса элемента интерфейса заключается в получении фокуса другим элементом.
|
Разве? А если это был клик по div'у?
|
|
26.09.2014, 18:51
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
А, блин, точно, это же не десктоп. Ну значит облом.
Нет, блин, надо проверить - на тело повесить щелчок и посмотреть доплывет до него фокус или нет.
|
|
29.09.2014, 10:21
|
Профессор
|
|
Регистрация: 11.02.2014
Сообщений: 303
|
|
Сообщение от kostyanet
|
blur окна это сферический конь в вакууме. Нет, как-то добиваются, во-первых сразу не через JS, а сугубо через DOM (onblur), во-вторых все равно не пашет.
|
Бред какой-то.
Сообщение от kostyanet
|
Нет, блин, надо проверить - на тело повесить щелчок и посмотреть доплывет до него фокус или нет.
|
Если фокусить нечего, фокус уходит на body всегда.
|
|
01.10.2014, 05:46
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Сообщение от WorM32
|
Бред какой-то.
|
Процитируйте не бред, типа там
window.addEventListener('blur',blah_blah);
чтобы blah_blah работала.
|
|
01.10.2014, 08:58
|
Профессор
|
|
Регистрация: 11.02.2014
Сообщений: 303
|
|
Сообщение от kostyanet
|
Процитируйте не бред, типа там
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>
|
|
01.10.2014, 12:16
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Круто, работает! Признаю свой бред.
И кажется я понял как он зародился. Ничтоже сумняще я повесил на размытие функцию console.log('blur') и сделав подвал браузера видимым начал переключаться между окнами. Х нанэ, не размывалось. Потащился в инет читать - там понаписано, короче, думаю, не суждено.
Оказывается консоль браузера - это отдельное окно. Когда оно активно то в клиенте уже никакого размытия не будет. Его и не было.
Спасибо.
|
|
|
|