Поведение фокуса выпадающего списка пользовательского интерфейса без заголовка

Я использую поле со списком безголового пользовательского интерфейса в качестве панели поиска автозаполнения (приложение React/Remix). Я хотел бы, чтобы панель поиска теряла фокус после отправки поиска.

На некоторых устройствах (например, iPhone Safari) это делается по умолчанию; однако на рабочем столе Chrome я получаю совсем другое поведение. Поле со списком перефокусируется, и я не могу понять, когда и почему он это делает, поэтому я не могу вручную размыть его в useEffect.

Все, что я мог сделать, чтобы взломать его, это размыть полосу на setTimeout.

В качестве примечания кажется, что при повторном применении фокуса в некоторых браузерах (например, сафари) курсор переходит в конец, как и следовало ожидать, но в других (например, хром) курсор переходит в начало ввода

zlach 19.04.2023 23:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
277
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я столкнулся с похожей проблемой и нашел решение, которое может быть не самым элегантным, но оно работает.

Во-первых, я добавил ссылку на элемент ввода ComboBox и использовал setTimeout с задержкой 0, чтобы размыть его:

const handleChangeEvent = (event) => {
  // other stuff
  setTimeout(() => {
    searchRef.current.blur()
  }, 0)
}

// a structure like this
<ComboBox onChange = {handleChangeEvent}>
  <Combobox.Input ref = {searchRef} />
</ComboBox>

Это отлично работало для ввода с клавиатуры, но я заметил, что когда я нажимал на ComboBox, он сразу фокусировался, а затем размывался из-за setTimeout, создавая заметный эффект мигания. Чтобы исправить это, я добавил событие onMouseDown в ComboBox и вызвал preventDefault(), чтобы предотвратить фокусировку ввода:

<Combobox.Options
  onMouseDown = {(e) => {
    e.preventDefault()
  }}
/>

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

Спасибо, что заглянули в мой пост! Да, я просто установил Timeout с задержкой 200 и не нуждался в onMouseDown, но я думаю, что ваше решение мне нравится больше! Хотелось бы узнать, знает ли кто-нибудь немного больше о том, что происходит под капотом безголового пользовательского интерфейса. Кажется, он делает многое, о чем он не говорит нам в документах.

zlach 24.04.2023 16:09

просто измените этот метатег в заголовке вашего сайта

<meta name = "viewport" content = "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

Другие вопросы по теме