我有这个按钮,当点击打开一个复选框.我可以使用"tab"键导航到按钮,以及点击"空格"或"回车"键打开按钮.但是我不能通过使用向上和向下箭头键来浏览器的复选框.这是相关代码:

<button class = “setting-button" mat-button [matmenuTriggerfor] =“settings" <fa-icon [icon]-"settingsIcon"></fa-icon> </button>

<mat-menu #settings="matMenu" >
<div *ngFor="let id of arraycolumns">
<div *nglf=" ![‘Cashless', 'Borrower', 'options', 'isfavorite', 'Progress', 'Deal Name'].includes(id)" mat-menu-item >
 <mat-checkbox class="chkbx" #singleCheckbox [checked]= 'fieldcolumnsChecked.indexof(id) >= 0' (change)="checkcolumnsChanged(id)" (click)="$event.stopPropagation();">
{{id}} 
</mat-checkbox>
</div> 
</div> 
</mat-menu>

在TS文件中,我有这个:

@ViewChildren("singleCheckbox") checkboxes!: QueryList<MatCheckbox>;

如何才能在下拉列表中启用导航?请救救我!谢谢您:)

推荐答案

我认为你可以利用ANGLING的HostListener来监听键盘事件并操纵焦点.

将tabIndex添加到mat-复选框以使其可聚焦,并在组件中实现HostListener以侦听Keydown事件.

当按下箭头键时,相应地更改复选框的焦点.

超文本标记语言:

<mat-menu #settings="matMenu">
    <div *ngFor="let id of arraycolumns; let i = index">
        <div *ngIf="![‘Cashless', 'Borrower', 'options', 'isfavorite', 'Progress', 'Deal Name'].includes(id)" mat-menu-item>
            <mat-checkbox class="chkbx" #singleCheckbox [checked]='fieldcolumnsChecked.indexOf(id) >= 0' (change)="checkcolumnsChanged(id)" (click)="$event.stopPropagation();" [tabIndex]="i">
                {{id}} 
            </mat-checkbox>
        </div> 
    </div> 
</mat-menu>

Typescript :

import { HostListener, QueryList, ViewChildren } from '@angular/core';
import { MatCheckbox } from '@angular/material/checkbox';

// ... (other imports)

export class YourComponent {

    @ViewChildren("singleCheckbox") checkboxes!: QueryList<MatCheckbox>;

    currentFocusIndex = 0;

    // ...

    @HostListener('document:keydown', ['$event'])
    handleKeyboardEvent(event: KeyboardEvent) {
        if (this.checkboxes && this.checkboxes.length) {
            if (event.key === 'ArrowDown') {
                event.preventDefault();
                this.setFocus(true);
            } else if (event.key === 'ArrowUp') {
                event.preventDefault();
                this.setFocus(false);
            }
        }
    }

    setFocus(goDown: boolean) {
        if (goDown && this.currentFocusIndex < this.checkboxes.length - 1) {
            this.currentFocusIndex++;
        } else if (!goDown && this.currentFocusIndex > 0) {
            this.currentFocusIndex--;
        }
        const checkboxArray = this.checkboxes.toArray();
        checkboxArray[this.currentFocusIndex].focus();
    }

    // ... (rest of your code)
}

Javascript相关问答推荐

如何使图像逐渐/平稳地响应(先减少宽度,然后减少高度)

Promise.all立即跳到那时,而不是调用所有Promise

将音频记录从js发送到activx-web服务器以保存到磁盘

自定义帖子类型帖子未显示在网站上

在具有焦点和上下文的d3多线图表中,如何将上下文的刷新限制在特定日期?

使用JavaScript单击上一个或下一个特定按钮创建卡滑动器以滑动单个卡

如何判断属于多个元素的属性是否具有多个值之一

vscode扩展-webView Panel按钮不起任何作用

如何将连续的十六进制字符串拆分为以空间分隔的十六进制块,每个十六进制块包含32个二元组?

在nextjs服务器端api调用中传递认证凭证

使用JQuery单击元素从新弹出窗口获取值

获取Uint8ClampedArray中像素数组的宽度/高度

用于编辑CSS样式的Java脚本

虚拟滚动实现使向下滚动可滚动到末尾

如何在ASP.NET项目中使用Google Chart API JavaScript将二次轴线值格式化为百分比

用于在路径之间移动图像的查询

删除加载页面时不存在的元素(JavaScript)

为什么延迟在我的laravel项目中不起作用?

构建器模式与参数对象输入

无法使用npm install安装react-dom、react和next