You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 17中含按钮的mat-form-field回车自动获焦异常问题

Angular 17 表单回车键焦点异常跳转问题

问题描述

在Angular 17表单中,当存在包含后缀按钮的mat-form-field控件时,在表单内其他输入控件(如单选按钮组)上按下回车键,焦点会自动跳转到该带按钮的输入框,此行为不符合预期。

代码示例

<form [formGroup]="reactiveForm">
  <mat-radio-group aria-label="Select a fruit" formControlName="radioFruit">
    <mat-radio-button aria-label="apples" value="apples">Apples</mat-radio-button>
    <mat-radio-button aria-label="oranges" value="oranges">Oranges</mat-radio-button>
  </mat-radio-group>

  <mat-form-field>
    <mat-label>Enter your password</mat-label>
    <input matInput type="text">
    <button mat-icon-button matSuffix>
      <mat-icon>{{hide ? 'visibility_off' : 'visibility'}}</mat-icon>
    </button>
  </mat-form-field>
</form>

问题原因

表单内的<button>元素默认type为submit,当在表单控件上按下回车键时,浏览器会自动触发表单提交行为,并将焦点聚焦到表单内第一个submit按钮关联的输入控件上,也就是带后缀按钮的mat-form-field中的输入框。

解决方案

方案1:给按钮明确设置type="button"

修改按钮类型,避免其被识别为提交按钮:

<button mat-icon-button matSuffix type="button">
  <mat-icon>{{hide ? 'visibility_off' : 'visibility'}}</mat-icon>
</button>

方案2:阻止单选组的回车键默认行为

在mat-radio-group上添加事件,拦截回车键的默认动作:

<mat-radio-group 
  aria-label="Select a fruit" 
  formControlName="radioFruit"
  (keydown.enter)="$event.preventDefault()"
>
  <mat-radio-button aria-label="apples" value="apples">Apples</mat-radio-button>
  <mat-radio-button aria-label="oranges" value="oranges">Oranges</mat-radio-button>
</mat-radio-group>

方案3:全局禁用表单的默认回车提交行为

如果表单不需要回车提交功能,可在<form>标签上直接拦截:

<form [formGroup]="reactiveForm" (keydown.enter)="$event.preventDefault()">
  <!-- 表单内容 -->
</form>

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:33:27