** 温馨提示:如需转载本文,请注明内容出处。**

本文链接: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, EventEmitter, HostListener, Input, Output } from '@angular/core'; @Directive({
selector: '[unumber]'
})
export class ValidNumberDirective {
@Input("unumber") unumberlength: number;
constructor(public el: ElementRef) {
el.nativeElement.setAttribute('title', 'Only accept number.');
}
@Output() ngModelChange: EventEmitter<any> = new EventEmitter();
@HostListener('blur', ['$event'])
onBlur($event: any) {
this.ngModelChange.emit($event.target.value);
}
@HostListener('keypress', ['$event'])
OnKeyPress(event: any) {
const keycode = (event.which) ? event.which : event.keyCode;
if (this.el.nativeElement.value.length >= this.unumberlength && window.getSelection()!.type != 'Range' && keycode != 8 && keycode != 46 && keycode != 37 && keycode != 39) {
event.returnValue = false;
return false;
}
if (keycode > 31 && (keycode < 48 || keycode > 57) && keycode != 46) {
return false;
}
else if (keycode == 46 && this.el.nativeElement.value.indexOf(".") > -1) {
return false;
}
return true;
} @HostListener('paste', ['$event']) OnPaste(e: any) {
e.preventDefault();
return; // - 为什么不在keydown里把字符串截取了:因为keydown的时候录入的字符还没有赋值到dom里去
// - 为什么不在达到最大长度时禁止键盘输入:除非你不想要复制粘贴的功能可以把键盘上2个delete以外的按钮禁掉,可以避免出现输入的字符“闪现”的效果
// @HostListener('keyup', ['$event']) OnKeyup(e: any) {
// if (e.key == ".") return;
// if (isNaN(parseInt(e.key))) return;
// this.el.nativeElement.value = this.el.nativeElement.value.replace("e", "").replace("E", "").replace("+", "").replace("-", "");
// if (this.el.nativeElement.value.length > this.unumberlength) {
// this.el.nativeElement.value = this.el.nativeElement.value.slice(0, this.unumberlength);
// }
// }
// @HostListener('change', ['$event']) OnChange(e: any) {
// this.el.nativeElement.value = this.el.nativeElement.value.replace("e", "").replace("E", "").replace("+", "").replace("-", "");
// if (this.el.nativeElement.value.length > this.unumberlength) {
// this.el.nativeElement.value = this.el.nativeElement.value.slice(0, this.unumberlength);
// }
// }
// @HostListener('blur', ['$event']) OnBlur(e: any) {
// this.el.nativeElement.value = this.el.nativeElement.value.replace("e", "").replace("E", "").replace("+", "").replace("-", "");
// if (this.el.nativeElement.value.length > this.unumberlength) {
// this.el.nativeElement.value = this.el.nativeElement.value.slice(0, this.unumberlength);
// }
// }
}
}

Angular2 通过自定义指令限制输入框输入类型的更多相关文章

  1. 从一次输入框无法输入的bug,谈如何限制输入框输入类型

    bug的产生和修改 上周临近周末休息的时候,一个同事跑过来了,对我说:"阿伦啊,有一个页面出问题了,火狐浏览器所有的input都没法输入了."我一听,是不是你给加了什么属性,让in ...

  2. angular2采用自定义指令(Directive)方式加载jquery插件

    由于angular2兴起不久,相关插件还是很少,所以有时候不得不用一些jquery插件来完成项目, 那么如何把jquery插件放到angular2中呢?采用自定义指令! 在上下文之前要引入jquery ...

  3. Angular17 Angular自定义指令

    1 什么是HTML HTML文档就是一个纯文本文件,该文件包含了HTML元素.CSS样式以及JavaScript代码:HTML元素是由标签呈现,浏览器会为每个标签创建带有属性的DOM对象,浏览器通过渲 ...

  4. Vue input 控件: 通过自定义指令(directive)使用正则表达式限制input控件的输入

    前言: 网站中的input输入框使用非常广泛,因业务场景不同需要对输入框做合法性校验或限制输入,比如电话号码.邮件.区号.身份证号等.input框的不合法内容主要有两种方式处理:1.用户输入内容后,通 ...

  5. Vue的土著指令和自定义指令

    1.土著指令 当我开始学习Vue的时候,看官网的时候看到了"指令"两个字.我愣住了,what?指令是啥啊?后来继续往下看,像这种什么"v-for""v ...

  6. vue.js自定义指令详解

    写在文本前:相信在做vue的项目,你肯定接触了指令,我们常用vue内置的一些指令,比如v-model,v-text,v-if,v-show等等,但是这些内置指令不在本文的讲解范畴,本文想说的是其自定义 ...

  7. Vue指令及自定义指令的使用

    导航列表: 一.vue指令 二.自定义指令 一.vue指令 回到顶部    1. v-text v-text主要用来更新textContent,可以等同于JS的text属性,不会解析标签,会把标签解析 ...

  8. HTML5日期输入类型(date)

    在很多页面和web应用中都有输入日期和时间的地方,最典型的是订飞机票,火车票,酒店,批萨等网站. 在HTML5之前,对于这样的页面需求,最常见的方案是用Javascript日期选择组件.这几乎是无可争 ...

  9. angularJS——自定义指令

    主要介绍指令定义的选项配置 //angular指令的定义,myDirective ,使用驼峰命名法 angular.module('myApp', []) .directive('myDirectiv ...

  10. angular 自定义指令详解 Directive

    在angular中,Directive,自定义指令的学习,可以更好的理解angular指令的原理,当angular的指令不能满足你的需求的时候,嘿嘿,你就可以来看看这篇文章,自定义自己的指令,可以满足 ...

随机推荐

  1. 如何从AWS中学习如何使用AmazonVPC

    目录 如何从 AWS 中学习如何使用 Amazon VPC? 随着 AWS 的迅速发展,Amazon VPC(Virtual Private Cloud)已经成为了一种非常重要的云计算基础设施.VPC ...

  2. .Net8的AOT引导程序BootStrap

    前言 .Net8的本地预编机器码AOT,它几乎进行了100%的自举.微软为了摆脱C++的钳制,做了很多努力.也就是代码几乎是用C#重写,包括了虚拟机,GC,内存模型等等.而需要C++做的,也就仅仅是引 ...

  3. 图像格式及Matlab的格式转换

    1. matlab图像保存说明 matlab中读取图片后保存的数据是uint8类型(8位无符号整数,即1个字节),以此方式存储的图像称作8位图像,好处相比较默认matlab数据类型双精度浮点doubl ...

  4. Day14_Java_作业

    编程题: 1:获取10个1-20之间的随机数,要求不能重复 答: package StudentWork; import java.util.ArrayList; /** * * 需求: 1:获取10 ...

  5. subprocess Python执行系统命令最优选模块

    简介 subprocess 是 Python 中执行操作系统级别的命令的模块,所谓系级级别的命令就是如ls /etc/user ifconfig 等和操作系统有关的命令. subprocess 创建子 ...

  6. 【MAUI Blazor踩坑日记】3.Windows标题栏自定义颜色,运行时改变颜色

    目录 修改默认颜色 修改运行时颜色 效果图 MAUI中Windows默认的标题栏颜色是灰色的,有一点丑. 如果去掉默认的标题栏,自己画一个,可能会出现问题,也比较麻烦. 想要自定义默认标题栏的颜色,官 ...

  7. Pandas:在DataFrame中添加一行,并设置行索引

    解决方案 效果图 参考链接 https://blog.csdn.net/Caiqiudan/article/details/107788525

  8. .NET周刊【7月第5期 2023-07-30】

    国内文章 PaddleSharp:跨越一年的版本更新与亮点 https://www.cnblogs.com/sdflysha/p/20230724-paddlesharp-in-a-year.html ...

  9. 2023-08-06:小青蛙住在一条河边, 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上 给定一个长度为n的数组ar

    2023-08-06:小青蛙住在一条河边, 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上 给定一个长度为n的数组ar ...

  10. 从浅入深了解.NET Core MVC 2.x全面教程

    一.基础 1.默认配置 使用Kestrel Web Server ASP.NET Core内置--跨平台 IIS集成 UseIIS() UseIISIntergration() Log IConfig ...