Установка фокуса на первый элемент списка в HTML + Angular вместо этого фокусирует второй элемент

Я работал над требованием к пользовательскому интерфейсу: как только клавиша табуляции нажата в первый раз, мне нужно настроить фокус на первом элементе элемента списка, который состоит из массива объектов. В следующий раз, когда я нажимаю клавишу Tab, мне нужно просмотреть элементы списка, и если я дойду до конца списка, я вернусь к первому элементу.

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

Это HTML-код компонента:

<div class = "row">
  <div class = "col-md-12">
    <div class = "grandparent">
      <div class = "parent">
        <ul #optionsTypeMenu>
          <li *ngFor = "let option of options; let i = index; last as isLast" (click) = "open(option)" tabindex = "0" id = "{{option.name}}">
            <div class = "event-badge-block"
              [ngClass] = "{ 'select': isSubmitted, 
                            'disabled': optionSelectionDisabled(option, isLast) }">
              <small class = "bagde">{{ i + 1 }}</small>
              <div class = "option-label">
                <span>{{ option.name}}
                </span>
              </div>
            </div>
          </li>
        </ul>
      </div>
    </div>
  </div>
</div>

А это код клавиши табуляции:

@HostListener('document:keydown.tab') focusOptionFindingsSection(event: KeyboardEvent) {
        let activeElement = document.activeElement;
        let isCurrentFocusedElementTabable = this.optionsTypeMenu.nativeElement.contains(activeElement);

        if (!isCurrentFocusedElementTabable || this.CURR_TAB_INDEX == this.options.length - 1) {
            this.CURR_TAB_INDEX = 0;
        }

        if (this.CURR_TAB_INDEX == 0) {
            this.optionsTypeMenu.nativeElement.children[this.CURR_TAB_INDEX].focus();
        }

        this.CURR_TAB_INDEX++;
    }

Я отлаживал и пытался сосредоточить внимание с помощью document.getElementById... но получил тот же результат. Мне было интересно, мог ли я что-то пропустить, но не уверен, что причиной может быть tabindex, но любая подсказка или помощь очень ценятся. Заранее спасибо.

По просьбе я создал Stackblitz: https://stackblitz.com/edit/get-data-and-display-in-ul-and-li-hbg7xj?file=src%2Fapp%2Fapp.comComponent.ts

Можете ли вы создать stackblitz?

Chellappan வ 12.03.2024 03:09

да, конечно, я обновил пост, добавив следующий URL: stackblitz.com/edit/…

Marcelo Tataje 18.03.2024 01:58
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
2
284
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это может быть поведение браузера по умолчанию. Попробуйте добавить оператор event.preventDefault() перед установкой активного элемента.

Спасибо за предложение, однако оно не работает, событие отображается как неопределенное, я добавил туда условие для вызова метода предотвращения по умолчанию только тогда, когда событие имеет значение, но оно не вносит никаких изменений :(

Marcelo Tataje 12.03.2024 06:41

Когда страница загружается, каково значение индекса текущей вкладки. А еще можешь ли ты создать stackblitz?

Amenawon Esezobor 12.03.2024 17:53

точно, я только что это сделал: stackblitz.com/edit/…

Marcelo Tataje 18.03.2024 01:58
Ответ принят как подходящий

@Amenawon прав в том, что проблема в том, что вы запускаете событие фокуса дважды.

Один раз от this.optionsTypeMenu.nativeElement.children[0].focus();, а второй — событие по умолчанию от клавиши tab.

Чтобы сделать это правильно и предотвратить это в angular, нам нужно указать, какой ключ слушать и какие аргументы передать слушателю.

вот так @HostListener('document:keydown.tab', ['$event'])

Вот почему ваш аргумент события был неопределенным

полное исправление смотрите здесь, на stackblitz

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