仅允许角度材料2输入字段中的数字,TAB,DELETE,BACKSPACE,左箭头,右箭头

时间:2017-12-20 19:02:28

标签: angular typescript angular-material2

我试图阻止字符和其他键盘输入,但数字标签键退格键删除除外左箭头右箭头

我刚试过以下代码,但这可以输入几个字符,

<input type="text" matInput required name="mobileNumber"  onkeypress='return ((event.charCode >= 48 && event.charCode <= 57) || (event.charCode >= 96 && event.charCode <= 105) || (event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 46 || event.keyCode == 37 || event.keyCode == 39))'>

这是the working example

如何正确阻止

2 个答案:

答案 0 :(得分:0)

以下是我的解决方案:

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

@Directive({
    selector: '[myNumberOnly]'
})
export class NumberOnlyDirective {
    // Allow decimal numbers. The \. is only allowed once to occur
    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> = [ '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;
        }

        // Do not use event.keycode this is deprecated.
        // See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
        let current: string = this.el.nativeElement.value;
        // We need this because the current value on the DOM element
        // is not yet updated with the value from this event
        let next: string = current.concat(event.key);
        if (next && !String(next).match(this.regex)) {
            event.preventDefault();
        }
    }
}

答案 1 :(得分:0)

我很确定你想知道这里的问题是什么,因为你使用的字符代码是HTML字符代码,你肯定会使用正确的字符。这里的问题是,您的onkeypress事件会为您提供字符的ASCII代码,这就是您可以在输入字段中从'a'键入'i'的原因。

我建议的就是这样离开

onkeypress='return (event.charCode >= 48 && event.charCode <= 57)'

其他键(箭头,删除等等)仍然可以使用。