Как ограничить клавишу табуляции в модальном окне?

У меня есть модальное окно, которое появляется при нажатии на ссылку .btn.

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

Есть ли способ отключить фоновую вкладку, пока модальное окно активно?

Я использую следующие версии:

https://valor-software.com/ngx-bootstrap/#/modals (V2.4), Угловой CLI 1.6

Я нашел аналогичную проблему и ответил, преобразовал функцию disableTabModalShown в директиву в своем приложении. stackoverflow.com/questions/25142244/…

svs 24.04.2018 13:55
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
3
1
2 770
2

Ответы 2

вы должны использовать класс на фоновой странице, у которого есть pointer-events: none;, когда модальное окно открыто. Просто используйте ngClass, чтобы его можно было динамически изменять при щелчке по вашему .btn и переключать модальное событие закрытия.

Можно ли ограничить вкладку внутри самого модального окна?

svs 23.04.2018 16:05

Я думаю, что указатель-события: нет; уже делает это; Вы спрашиваете что-то вроде: указатель мыши не может выйти из модального окна?

Luca Taccagni 23.04.2018 16:08

Я хочу разместить клавишу табуляции внутри самого модального окна, как в демонстрации getbootstrap.com/docs/4.0/components/modal/#live-demo. В плагине, который я использую, он сейчас не работает. Я ищу решение этой проблемы.

svs 24.04.2018 06:26

как я вижу в этом примере, вы можете использовать события указателя! Итак, я думаю, вы спрашиваете, как сделать модальное закрытие, когда вы щелкаете снаружи, не так ли?

Luca Taccagni 24.04.2018 09:33

Поскольку в последней версии ngx-bootstrap (v2.4) нет исправления, я создал директиву для захвата фокуса клавиши табуляции в самом модальном поле.

Я использовал угловую версию: Angular 5.

Моя директива ниже.

Directive

import {Directive, ElementRef, HostListener} from '@angular/core';
@Directive({
    selector: '[appSdbModalFocus]'
})
export class SdbModalFocusDirective {
    KEYCODE_TAB: number = 9;

    constructor(
        private hostElement: ElementRef
    ) {}

    ngOnInit() {}

    @HostListener("keydown", ["$event"])
    onKeyDown(e: KeyboardEvent): any {
        if (e.key === 'Tab' || e.keyCode === this.KEYCODE_TAB) {
            let focusableEls = this.hostElement.nativeElement;
            let modalContent = $(focusableEls).find('a, :input, [tabindex]');
            var firstFocusableEl = modalContent.first()[0];
            var lastFocusableEl = modalContent.last()[0];

            if (e.shiftKey) /* shift + tab */ {
                this.log(firstFocusableEl, lastFocusableEl, document);
                if (document.activeElement === firstFocusableEl) {
                    lastFocusableEl.focus();
                    e.preventDefault();
                }
            } else /* tab */ {
                this.log(firstFocusableEl, lastFocusableEl, document);
                if (document.activeElement === lastFocusableEl) {
                    firstFocusableEl.focus();
                    e.preventDefault();
                }    
            }
        }
    }
}

HTML

<form appSdbModalFocus>
...
</form>

Создал эту директиву с помощью ловушка-фокус-в-элементе

Спасибо! Я сам реализовал это решение. Вы должны принять свой собственный ответ.

Chanandler Bong 23.11.2018 15:27

Он работает, пока я не добавлю кнопку к модальному содержимому (find ('a, button,: input, ...). Кроме того, кажется, что он работает, только если директива применяется к форме. Я бы хотел переместить ее вверх, поэтому он охватывает весь модальный экран (кнопка закрытия вверху, некоторые кнопки внизу). По какой-либо причине директива не должна работать, если применяется к div, который обертывает форму и модальный-заголовок, модальный-нижний колонтитул?

Wallace Howery 21.02.2019 20:19

В этом решении используется $ (...). Find (), и я видел другой аналогичный пример, в котором используется .querySelectAll (). Однако как это можно было заменить с помощью Angular @ViewChildren?

Sevenfold 25.08.2020 17:22

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