Angular2 通过自定义指令限制输入框输入类型
** 温馨提示:如需转载本文,请注明内容出处。**
本文链接: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 通过自定义指令限制输入框输入类型的更多相关文章
- 从一次输入框无法输入的bug,谈如何限制输入框输入类型
bug的产生和修改 上周临近周末休息的时候,一个同事跑过来了,对我说:"阿伦啊,有一个页面出问题了,火狐浏览器所有的input都没法输入了."我一听,是不是你给加了什么属性,让in ...
- angular2采用自定义指令(Directive)方式加载jquery插件
由于angular2兴起不久,相关插件还是很少,所以有时候不得不用一些jquery插件来完成项目, 那么如何把jquery插件放到angular2中呢?采用自定义指令! 在上下文之前要引入jquery ...
- Angular17 Angular自定义指令
1 什么是HTML HTML文档就是一个纯文本文件,该文件包含了HTML元素.CSS样式以及JavaScript代码:HTML元素是由标签呈现,浏览器会为每个标签创建带有属性的DOM对象,浏览器通过渲 ...
- Vue input 控件: 通过自定义指令(directive)使用正则表达式限制input控件的输入
前言: 网站中的input输入框使用非常广泛,因业务场景不同需要对输入框做合法性校验或限制输入,比如电话号码.邮件.区号.身份证号等.input框的不合法内容主要有两种方式处理:1.用户输入内容后,通 ...
- Vue的土著指令和自定义指令
1.土著指令 当我开始学习Vue的时候,看官网的时候看到了"指令"两个字.我愣住了,what?指令是啥啊?后来继续往下看,像这种什么"v-for""v ...
- vue.js自定义指令详解
写在文本前:相信在做vue的项目,你肯定接触了指令,我们常用vue内置的一些指令,比如v-model,v-text,v-if,v-show等等,但是这些内置指令不在本文的讲解范畴,本文想说的是其自定义 ...
- Vue指令及自定义指令的使用
导航列表: 一.vue指令 二.自定义指令 一.vue指令 回到顶部 1. v-text v-text主要用来更新textContent,可以等同于JS的text属性,不会解析标签,会把标签解析 ...
- HTML5日期输入类型(date)
在很多页面和web应用中都有输入日期和时间的地方,最典型的是订飞机票,火车票,酒店,批萨等网站. 在HTML5之前,对于这样的页面需求,最常见的方案是用Javascript日期选择组件.这几乎是无可争 ...
- angularJS——自定义指令
主要介绍指令定义的选项配置 //angular指令的定义,myDirective ,使用驼峰命名法 angular.module('myApp', []) .directive('myDirectiv ...
- angular 自定义指令详解 Directive
在angular中,Directive,自定义指令的学习,可以更好的理解angular指令的原理,当angular的指令不能满足你的需求的时候,嘿嘿,你就可以来看看这篇文章,自定义自己的指令,可以满足 ...
随机推荐
- celery笔记七之周期/定时任务及crontab定义
本文首发于公众号:Hunter后端 原文链接:celery笔记七之周期/定时任务及crontab定义 periodic task,即为周期,或者定时任务,比如说每天晚上零点零分需要运行一遍某个函数,或 ...
- 自然语言处理 Paddle NLP - 文本翻译技术及应用-理论
什么是机器翻译 机器翻译质量的自动评价 从统计机器翻译到神经网络机器翻译 多语言/多领域/多模态的翻译应用 神经网络机器翻译面临的挑战 视频:https://aistudio.baidu.com/ai ...
- TCP/IP网络体系结构中,各层的作用,以及各层协议的作用。
1.[TCP/IP]协议中每层的作用 从协议分层模型方面来讲,TCP/IP由四个层次组成:数据链路层(网络接口层).网络层.传输层.应用层 TCP/IP网络体系结构中,各层作用: 1.网络接口层:负责 ...
- vscode中react组件
通过使用这个插件我们可以很方便的进行组件/方法/文件的导入 本篇博客仅对插件进行介绍翻译,便于自己以后使用 常用片段列表 imr: 引入 React import React from 'react' ...
- Web网页音视频通话之基于Sipjs
简述 本文是以FreeSwitch作为信令服务器,通过sipjs(基于webRtc) 进行媒体协商,网络协商后,进行P2P媒体传输. 参考知识: sip.js https://sipjs.com/ w ...
- 在映客的虚拟KTV里唱了一首“爱你”
如果你突然打了个喷嚏 那一定就是我在想你 如果半夜被手机吵醒 啊~那是你的虚拟 KTV 在响起 2022 年 5 月 18 日,映客 App 上线了业内首个元宇宙 K 歌玩法「全景 K 歌」,给用 ...
- 懒人的百宝箱「GitHub 热点速览」
本周 GitHub Trending 除了 lazydocker 之外,还有多个 lazy 项目上线,比如大家熟悉的 lazyvim,可见,这个世界对懒人还是很友好的.除此之外,主打一个密码免输入,绕 ...
- 线程池shutdown引发TimeoutException
问题描述 分享一个发版过程服务报错问题,问题出现在每次发版,服务准备下线的时候,报错的位置是在将任务submit提交给线程池,使用Future.get()引发的TimeoutException,错误日 ...
- 四 APPIUM GUI讲解(Windows版)(转)
Windows版本的APPIUM GUI有以下图标或者按钮: ·Android Settings - Android设置按钮,所有和安卓设置的参数都在这个里面 ·General Settings – ...
- ❤️ GitHub Copilot 读心术揭秘,Copilot 逆向工程笔记
总览 你是否好奇 GitHub Copilot 如何知道你想写的内容?有时候它聪明得甚至好像读过你项目里其他文件一样,不要怀疑,它确实读过.这篇文章记录了我阅读一个对 Copilot 的逆向工程的笔记 ...