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

Angular 14:如何为时间输入框添加固定冒号并自动跳转?

在Angular 14中实现带固定冒号的时间输入框(自动跳转)

你可以通过监听输入事件+格式化处理来实现类似效果,以下是两种常用方案:

方案一:使用模板驱动表单(ngModel)

1. 修改组件模板

绑定ngModel并添加输入/按键事件监听,限制最大输入长度:

<mdb-form-control>
  <input 
    id="arrivalTime" 
    mdbInput
    type="text" 
    class="form-control" 
    placeholder="--:--"
    [(ngModel)]="arrivalTime"
    (input)="formatTimeInput()"
    (keydown)="handleTimeKeydown($event)"
    maxlength="5"
  />
  <label mdbLabel class="form-label">Arrival Time</label>
</mdb-form-control>

2. 组件TS逻辑处理

实现格式化和光标跳转逻辑:

import { Component } from '@angular/core';

@Component({
  selector: 'app-time-input',
  templateUrl: './time-input.component.html',
  styleUrls: ['./time-input.component.css']
})
export class TimeInputComponent {
  arrivalTime = '';

  formatTimeInput(): void {
    // 过滤所有非数字字符
    let cleanValue = this.arrivalTime.replace(/\D/g, '');
    
    // 当输入长度≥2时自动插入冒号
    if (cleanValue.length >= 2) {
      cleanValue = `${cleanValue.slice(0, 2)}:${cleanValue.slice(2, 4)}`;
    }
    
    this.arrivalTime = cleanValue;
  }

  handleTimeKeydown(event: KeyboardEvent): void {
    const inputEl = event.target as HTMLInputElement;
    const cursorPos = inputEl.selectionStart;

    // 处理删除键:光标在冒号位置时,自动移除冒号并调整光标到前一位
    if ((event.key === 'Backspace' || event.key === 'Delete') && cursorPos === 2) {
      event.preventDefault();
      this.arrivalTime = this.arrivalTime.replace(':', '');
      inputEl.setSelectionRange(1, 1);
    }
  }
}

方案二:使用响应式表单(FormControl)

如果项目用响应式表单,可通过监听控件值变化实现:

1. 修改组件模板

绑定formControl并添加按键事件监听:

<mdb-form-control>
  <input 
    id="arrivalTime" 
    mdbInput
    type="text" 
    class="form-control" 
    placeholder="--:--"
    [formControl]="arrivalTimeControl"
    (keydown)="handleTimeKeydown($event)"
    maxlength="5"
  />
  <label mdbLabel class="form-label">Arrival Time</label>
</mdb-form-control>

2. 组件TS逻辑处理

import { Component, OnInit } from '@angular/core';
import { FormControl } from '@angular/forms';

@Component({
  selector: 'app-time-input',
  templateUrl: './time-input.component.html',
  styleUrls: ['./time-input.component.css']
})
export class TimeInputComponent implements OnInit {
  arrivalTimeControl = new FormControl('');

  ngOnInit(): void {
    // 监听控件值变化,自动格式化
    this.arrivalTimeControl.valueChanges.subscribe(val => {
      if (!val) return;

      let cleanValue = val.replace(/\D/g, '');
      if (cleanValue.length >= 2) {
        cleanValue = `${cleanValue.slice(0, 2)}:${cleanValue.slice(2, 4)}`;
      }

      // 避免循环触发值变化事件
      if (cleanValue !== val) {
        this.arrivalTimeControl.setValue(cleanValue, { emitEvent: false });
      }
    });
  }

  handleTimeKeydown(event: KeyboardEvent): void {
    const inputEl = event.target as HTMLInputElement;
    const cursorPos = inputEl.selectionStart;

    if ((event.key === 'Backspace' || event.key === 'Delete') && cursorPos === 2) {
      event.preventDefault();
      const currentVal = this.arrivalTimeControl.value || '';
      const newVal = currentVal.replace(':', '');
      this.arrivalTimeControl.setValue(newVal, { emitEvent: false });
      inputEl.setSelectionRange(1, 1);
    }
  }
}

额外优化点

  • 可以添加输入验证:提交时检查小时(0-23)和分钟(0-59)的合法性
  • 优化光标逻辑:比如用户手动移动光标到冒号后输入时,自动将数字追加到对应位置
  • 支持粘贴格式化:监听paste事件,对粘贴的文本进行同样的格式化处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:45:37