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

本文链接: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. 前端Vue组件之仿京东拼多多领取优惠券弹出框popup 可用于电商商品详情领券场景使用

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身.通过组件化开发,可以有效 ...

  2. 报错 no currentsessioncontext configured!

    no currentsessioncontext configured! 使用hibernate框架报错 配置了session工厂类,使用getCurrentSession();时候引起的,原因是cu ...

  3. 2023年郑州轻工业大学校赛邀请赛zxy

    第一次组队和大家去外校打比赛,真的是一次很棒的体验,尽管结果不尽人意,但总之收获颇丰,也认识到自身更多的不足. 本次比赛是三人一队,一台电脑,一分纸质试题,我们三人开始先从第一题开始,这题看起来还行, ...

  4. Tomcat改jar

    Tomcat改jar 插件修改 <!-- <plugin>--> <!-- <groupId>org.apache.maven.plugins</gro ...

  5. 今日ERROR

    树莓派插卡发烫严重 首先,我们要知道: 树莓派的指示灯可以告诉用户系统的工作状态,常见的指示灯有四个,分别是红色电源灯.绿色SD卡读写灯.黄色ACT指示灯和蓝色网络连接指示灯(仅适用于某些型号的树莓派 ...

  6. Python异常模块与包

    Python异常模块与包 一.了解异常 1.1 什么是异常 当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常", 也就是我们常说 ...

  7. 我学到的一下vue使用技巧

    这两天学到的vue使用技巧 v-if , 当封装组件的时候,用到的props,最外层最好加个v-if,防止出现cannot read property of undefined 这样的错误,如果pro ...

  8. redis 中的 字符串

    String是redis 中的最基本的类型, 为二进制安全  ,意味着String可以表示各种类型  一个字符串value 最大为 521M set k1 v100 set k2 v200 get 命 ...

  9. 学习狂神Spring5_课堂笔记(更新中)

    Spring 简介 spring,英文单词为春天,表示为软件行业带来了春天. 2002年,首次推出了Spring框架的雏形:interface21框架.官网为:www.interface21.io但是 ...

  10. 代码随想录算法训练营第八天| LeetCode 344.反转字符串 541. 反转字符串II 151.翻转字符串里的单词

    344.反转字符串 卡哥建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数 题目链接/文章讲解/视频讲解:https: ...