【问题标题】:How to restrict Tab Key in the modal box?如何限制模态框中的 Tab 键?
【发布时间】:2018-04-23 13:07:02
【问题描述】:

我有一个模式窗口,当您单击 .btn 链接时会弹出。

当它处于活动状态时,用户仍然可以按 Tab 键专注于后台的链接和按钮,其中一些具有下载链接。当这些链接被关注并且用户按下回车键时,下载操作就会发生。

有没有办法在模态窗口处于活动状态时禁用背景选项卡?

我正在使用以下版本:

https://valor-software.com/ngx-bootstrap/#/modals (V2.4), Angular CLI 1.6

【问题讨论】:

标签: angular ngx-bootstrap-modal


【解决方案1】:

由于最新的 ngx-bootstrap(v2.4) 没有修复,我创建了一个指令来在模态框本身中捕获 tab 键焦点。

我使用的 Angular 版本是 Angular 5

我的指令如下。

指令

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>

trap-focus-in-an-element 的帮助下创建了这个指令

【讨论】:

  • 谢谢!我自己实现了这个解决方案。你应该接受你自己的答案。
  • 它有效,直到我将按钮添加到模态内容(find('a,button,:input,...)。此外,它似乎仅在将指令应用于表单时才有效.我想将它向上移动,所以它覆盖了整个模态(顶部的关闭按钮,底部的一些按钮).如果应用于包装表单和模态标题的div,该指令不应工作的任何原因,模态页脚?
  • 此解决方案使用 $(...).find(),我看到另一个使用 .querySelectAll() 的类似示例。但是,如何使用 Angular 的 @ViewChildren 替换它?
【解决方案2】:

你应该在后台页面上使用一个类,当模式启动时它有一个pointer-events: none;。只需使用 ngClass,它就可以在单击 .btn 时动态更改,并在模式关闭事件上切换。

【讨论】:

  • 是否可以在模态框内限制选项卡?
  • 我认为指针事件:无;已经做到了;您是在问类似的问题:鼠标指针无法从模态框中逃脱吗?
  • 我想在模态框本身内循环tab键,就像在演示getbootstrap.com/docs/4.0/components/modal/#live-demo中一样。在我正在使用的插件中,它现在不起作用。我正在寻找解决方案。
  • 正如我在该示例中看到的,您可以使用指针事件!所以我认为您是在问如何在单击外部时关闭模式,不是吗?
猜你喜欢
  • 2015-04-15
  • 2018-10-15
  • 1970-01-01
  • 2015-05-01
  • 2012-12-20
  • 2015-07-04
  • 2010-11-21
  • 2013-07-22
  • 1970-01-01
相关资源
最近更新 更多