javascript - “仅限数字指令”在 Chrome 49.xx.xx 及更低版本中不起作用

标签 javascript angular typescript input angular-directive

我正在使用 Angular 6,并编写了一条指令,将某些输入字段的输入限制为仅数字。该指令看起来像这样

import { Directive, ElementRef, HostListener } from '@angular/core';

@Directive({
  selector: '[NumbersOnly]'
})

export class NumbersOnlyDirective {
  // Allow decimal numbers and negative values
  private regex: RegExp = new RegExp(/^-?[0-9]+(\.[0-9]*){0,1}$/g);
  // Allow key codes for special events. Reflect :
  // Backspace, tab, end, home
  private specialKeys: Array<string> = ['ArrowLeft', 'ArrowRight', 'Backspace', 'Tab', 'End', 'Home'];

  constructor(private el: ElementRef) { }

  @HostListener('keydown', ['$event'])
  onKeyDown(event: KeyboardEvent) {
    // Allow Backspace, tab, end, and home keys
    if (this.specialKeys.indexOf(event.key) !== -1) {
      return;
    }
    const current: string = this.el.nativeElement.value;
    const next: string = current.concat(event.key);
    if (next && !String(next).match(this.regex)) {
      event.preventDefault();
    }
  }
}

无论我在哪里有输入字段,我都会使用如下指令

<input [(ngModel)]="sendLinkMobile" NumbersOnly type="text" id="mobile-num"  
class="form-control m-no" placeholder="Mobile Number"  requried  minlength="10" 
maxlength="10" aria-label="Recipient's username" aria-describedby="basic-addon2">

该代码可以在所有最新的浏览器、手机、选项卡中完美运行。但是,在 chrome 49.xx 及更低版本上使用它时,输入字段不会采用任何值。谁能帮我看看问题出在哪里?

提前致谢。

最佳答案

使用 it 指令并检查它。我认为它适用于 chrome 49.xx

import { Directive, ElementRef, HostListener, Input } from '@angular/core';

@Directive({
  selector: '[OnlyNumber]'
})
export class Onlynumber {

  constructor(private el: ElementRef) { }

  @Input() OnlyNumber: boolean;

  @HostListener('keydown', ['$event']) onKeyDown(event) {
    let e = <KeyboardEvent> event;
    if (this.OnlyNumber) {
      if ([46, 8, 9, 27, 13, 110, 190].indexOf(e.keyCode) !== -1 ||
        // Allow: Ctrl+A
        (e.keyCode === 65 && (e.ctrlKey || e.metaKey)) ||
        // Allow: Ctrl+C
        (e.keyCode === 67 && (e.ctrlKey || e.metaKey)) ||
        // Allow: Ctrl+V
        (e.keyCode === 86 && (e.ctrlKey || e.metaKey)) ||
        // Allow: Ctrl+X
        (e.keyCode === 88 && (e.ctrlKey || e.metaKey)) ||
        // Allow: home, end, left, right
        (e.keyCode >= 35 && e.keyCode <= 39)) {
          // let it happen, don't do anything
          return;
        }
        // Ensure that it is a number and stop the keypress
        if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
            e.preventDefault();
        }
      }
  }
}

HTML:

<input OnlyNumber="true"  type="text" #numberModel="ngModel" [(ngModel)]="numberModel"  name="numberModel" />

关于javascript - “仅限数字指令”在 Chrome 49.xx.xx 及更低版本中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51473683/

相关文章:

javascript - 编写脚本将我的 csv 信息转换为 JSON 格式

javascript - JS - 使用 IntersectionObserver 的测试代码

css - Angular 动态菜单和子菜单样式

angular - 禁用表单 typescript 中的所有控件

html - 在 Angular2 中显示默认图像

typescript - Jest expect 不会从异步等待函数中捕获抛出

javascript - Function.prototype.call 不使用提供的上下文调用方法

javascript - 将 html 传递给 Vue 组件

node.js - 很难启动 Angular CLI 服务器

angular - 尝试在我当前的 Angular 应用程序中使用异步管道而不是订阅