Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2019, 02:05   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию [РЕШЕНО] Событие onchange вызывается как onblur

Здравствуйте.
Сегодня я обнаружил забавную "не баг а фичу".

Есть поле ввода, которое изначально работает криво, и попытки исправить его изнутри не увенчались успехом. Детали о кривизне его работы - отдельная достаточно длинная история, поэтому сейчас не о нём, а про мой очередной костыль.
Если кратко - там проблема с селектором категории поиска, и поле ввода не реагирует на изменение селектора, если нажать на enter, а не на кнопку поиска.

Это кривое поле скрывается, и на его место ставится такое-же поле ввода, только со своим функционалом и обёрткой JS для передачи ввода пользователя в изначальное поле поиска, для того что бы поиск работал.

Теперь поиск работает как предполагается - одинаковая реакция на кнопку или enter, с учётом выбранной категории поиска - моё поле ввода передаёт значение в изначальное (скрытое) поле ввода, и если пользователь нажал enter - выполняется имитация нажатия на кнопку поиска, через эту кнопку всё работает как надо.

Но сегодня я обнаружил интересную вещь: после ввода и потери фокуса на элементе, не получается что либо изменить в моём поле ввода.
Полез в отладчик, и обнаружил, что в процессе набора текста не вызывается событие onchange, при этом решительно не понятно, каким образом восстанавливается уже введённый текст.
Когда я убрал фокус ввода - то сработал breakpoint, и "глаза полезли на лоб". Так должен работать onblur, а мне нужен классический onchange - то есть отслеживание изменений по мере ввода текста. Отслеживание на keydown/keypress/keyup не вариант, потому что в этих событиях ввод ещё не подтверждён, и начинаются танцы со спец-символами, позиционированием курсора ввода, и прочими бубнами.

Мне раньше даже пришлось прописать на enter дополнительную передачу значения в изначальное поле ввода, но тогда я не придал этому особого значения.

Всегда можно повесить setInterval, но даже у моего костыльно-ориентированного программирования есть предел.
По факту - setInterval не сможет полностью выполнить поставленную задачу, если скорость набора текста высокая (200+), даже если интервал задать 50 мс - проверено на себе.

Что по итогу - вопрос: как отслеживать уже выполненные изменения по мере набора текста ?
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 25.10.2019 в 05:15.
OmegaBerkut вне форума Ответить с цитированием
Старый 25.10.2019, 20:01   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

✔ Этот пост помечен как решение ✔


Попробуйте использовать событие input. То есть, обработчик oninput. Тогда ваш код будет выглядеть как-то так:

Код:
текстовоеПоле.oninput = function() {
  сделатьВсё();
  закрыть()
}
Хотя, лучше назначать обработчики через addEventListener:

Код:
addEventListener('input', <тут пишете обработчик в виде функционального литерала или ссылки на функцию>)

Последний раз редактировалось Вадим Мошев; 27.10.2019 в 21:48.
Вадим Мошев вне форума Ответить с цитированием
Старый 26.10.2019, 07:30   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
использовать событие input. То есть, обработчик oninput
Спасибо помогло.
У меня это проще =)
В имеющейся конструкции поменял onchange на oninput в разметке.

P. S. В данном проекте этот костыль далёк от убойных, можно сказать - это рядовой костыль.
Сегодня три часа костылял отключение автоматической фильтрации поиска, которая завязана на сессию.
В итоге получилась сввязка из четырёх костылей, что бы отправить ajax на отключение фильтрации если пользователь пришёл не с текущей страницы.
Ну и после аякса (коих может быть несколько) - обновление страницы, через 500 милисекунд =)
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 26.10.2019 в 07:39.
OmegaBerkut вне форума Ответить с цитированием
Старый 27.10.2019, 00:34   #4
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Хорошо, что получилось помочь.
Вадим Мошев вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OnBlur DIV Alex1991 JavaScript, Ajax 2 16.09.2011 22:20
событие OnChange у RadioGroup Andreych74 Общие вопросы Delphi 2 06.06.2011 12:43
Событие OnChange bboyb-rock JavaScript, Ajax 0 18.04.2011 00:07
Событие OnChange - на одно из полей namazi74 БД в Delphi 4 22.04.2010 12:52
Вычисления по условию. Событие onChange Наташа Помощь студентам 13 27.12.2006 12:28