** 温馨提示:如需转载本文,请注明内容出处。**
本文链接:https://www.cnblogs.com/grom/p/16814577.html

在input控件中,使用type=”number”是无法控制科学计数”e”的输入的,并且会导致maxlength长度控制属性的失效,故编写自定义指令,以达到纯数字输入的需求。

  • 构造函数里为dom添加type=’number’属性限制除E/e外字母输入

  • KeyDown事件限制键盘E按钮的输入

  • Keyup和Change事件过滤字母e并对长度进行超长截取,这里主要为了防止复制过来的超长度或带e的字符串

<!--html-->
<input unumber [unumberlength]="22">
//TypeScript
import { Directive, ElementRef, HostListener, Input } from '@angular/core';

@Directive({
  selector: '[unumber]',
  host: {
    '(keydown)': 'OnKeyDown($event)'
  }
})
export class ValidNumberDirective {
  @Input() unumberlength: number;
  constructor(public el: ElementRef) {
    el.nativeElement.setAttribute('type', 'number')
  }

  OnKeyDown(e: any) {
    var keycode = (Number)(e.keyCode);
    if (keycode == 69) {
      e.returnValue = false;
    }
  }

  @HostListener('keyup') OnKeyup() {
    this.el.nativeElement.value = this.el.nativeElement.value.replace('e', '').replace('E', '');
    if (this.el.nativeElement.value.length > this.unumberlength) {
      this.el.nativeElement.value = this.el.nativeElement.value.slice(0, this.unumberlength);
    }
  }
  @HostListener('change') OnChange() {
    this.el.nativeElement.value = this.el.nativeElement.value.replace('e', '').replace('E', '');
    if (this.el.nativeElement.value.length > this.unumberlength) {
      this.el.nativeElement.value = this.el.nativeElement.value.slice(0, this.unumberlength);
    }
  }

}

  • 为什么不在keydown里把字符串截取了:因为keydown的时候录入的字符还没有赋值到dom里去
  • 为什么不在达到最大长度时禁止键盘输入:除非你不想要复制粘贴的功能可以把键盘上2个delete以外的按钮禁掉,可以避免出现输入的字符“闪现”的效果

原文地址:http://www.cnblogs.com/grom/p/16814577.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性