如何使用 Angular 2 / Typescript 限制输入字段中的特殊字符
How to restrict special characters in the input field using Angular 2 / Typescript
我是新手Angular 2. 我需要防止在输入字段中输入特殊字符。如果我输入字母数字,它必须接受它们,而特殊字符应该被阻止。有谁能帮忙吗
我在这里分享代码。
在HTML中:
<md-input-container>
<input type="text" (ngModelChange)="omit_special_char($event)" mdInput name="name" [(ngModel)]="company.name" placeholder="Company Name" #name="ngModel" minlength="3" required>
</md-input-container>
在 TS 中:
public e: any;
omit_special_char(val)
{
var k;
document.all ? k = this.e.keyCode : k = this.e.which;
return ((k > 64 && k < 91) || (k > 96 && k < 123) || k == 8 || k == 32 || (k >= 48 && k <= 57));
}
angular2 代码示例。
<input type="text" pattern="/[A-Z]{5}\d{4}[A-Z]{1}/i">
或
<md-input-container>
<input type="text" (keypress)="omit_special_char($event)" mdInput name="name" [(ngModel)]="company.name" placeholder="Company Name" #name="ngModel" minlength="3" required>
</md-input-container>
omit_special_char(val)
{
var k;
document.all ? k = this.e.keyCode : k = this.e.which;
return ((k > 64 && k < 91) || (k > 96 && k < 123) || k == 8 || k == 32 || (k >= 48 && k <= 57));
}
这里是纯 javascript 中的工作示例,因为 angular2/typescript 不支持 Whosebug。
function omit_special_char(e) {
var k;
document.all ? k = e.keyCode : k = e.which;
return ((k > 64 && k < 91) || (k > 96 && k < 123) || k == 8 || k == 32 || (k >= 48 && k <= 57));
}
<input type="text" onkeypress="return omit_special_char(event)"/>
您可以使用 ng-change 属性,然后调用 javascript 中的函数并在那里验证..
<md-input-container>
<input type="text" mdInput ng-change="myValidationFunction()" name="name" placeholder="Company Name" #name="ngModel" ng-model="name" minlength="3" required>
</md-input-container>
在javaScript中:
myValidateFunction()
{
if ($scope.name.matches("^[a-zA-Z0-9]+$")) {
return true;
}
else {
return false
}
}
根据函数结果你可以做你想做的...验证或禁止或者如果你想显示任何 CSS 消息那么你可以
您可以将 html5 模式验证器用作
<input type="text" (ngModelChange)="omit_special_char($event)" mdInput name="name" [(ngModel)]="company.name" placeholder="Company Name" #name="ngModel" minlength="3" required pattern="[a-zA-Z0-9]">
在表单中添加 novalidate 然后你可以显示相同的错误
<div *ngIf="name?.errors.pattern && name.dirty && name.invalid">Error Message</div>
你做的一切都是对的。只是功能需要稍微改变一下。您正在使用 ngModelChange 绑定不存在的事件。您可以使用 keypress 事件处理程序,如下所示。
HTML
<md-input-container>
<input type="text" (keypress)="omit_special_char($event)" mdInput name="name" [(ngModel)]="company.name" placeholder="Company Name" #name="ngModel" minlength="3" required>
</md-input-container>
组件
omit_special_char(event)
{
var k;
k = event.charCode; // k = event.keyCode; (Both can be used)
return((k > 64 && k < 91) || (k > 96 && k < 123) || k == 8 || k == 32 || (k >= 48 && k <= 57));
}
"event" 是您之前传递的“$event”本身的对象。试试这个,它肯定会与angular2一起使用。
我结合了这个帖子和其他帖子的几个答案,创建了我的自定义指令来处理手动输入和粘贴数据。
指令:
import { Directive, ElementRef, HostListener, Input } from '@angular/core';
@Directive({
selector: '[appInputRestriction]'
})
export class InputRestrictionDirective {
inputElement: ElementRef;
@Input('appInputRestriction') appInputRestriction: string;
arabicRegex = '[\u0600-\u06FF]';
constructor(el: ElementRef) {
this.inputElement = el;
}
@HostListener('keypress', ['$event']) onKeyPress(event) {
if (this.appInputRestriction === 'integer') {
this.integerOnly(event);
} else if (this.appInputRestriction === 'noSpecialChars') {
this.noSpecialChars(event);
}
}
integerOnly(event) {
const e = <KeyboardEvent>event;
if (e.key === 'Tab' || e.key === 'TAB') {
return;
}
if ([46, 8, 9, 27, 13, 110].indexOf(e.keyCode) !== -1 ||
// Allow: Ctrl+A
(e.keyCode === 65 && e.ctrlKey === true) ||
// Allow: Ctrl+C
(e.keyCode === 67 && e.ctrlKey === true) ||
// Allow: Ctrl+V
(e.keyCode === 86 && e.ctrlKey === true) ||
// Allow: Ctrl+X
(e.keyCode === 88 && e.ctrlKey === true)) {
// let it happen, don't do anything
return;
}
if (['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'].indexOf(e.key) === -1) {
e.preventDefault();
}
}
noSpecialChars(event) {
const e = <KeyboardEvent>event;
if (e.key === 'Tab' || e.key === 'TAB') {
return;
}
let k;
k = event.keyCode; // k = event.charCode; (Both can be used)
if ((k > 64 && k < 91) || (k > 96 && k < 123) || k === 8 || k === 32 || (k >= 48 && k <= 57)) {
return;
}
const ch = String.fromCharCode(e.keyCode);
const regEx = new RegExp(this.arabicRegex);
if (regEx.test(ch)) {
return;
}
e.preventDefault();
}
@HostListener('paste', ['$event']) onPaste(event) {
let regex;
if (this.appInputRestriction === 'integer') {
regex = /[0-9]/g;
} else if (this.appInputRestriction === 'noSpecialChars') {
regex = /[a-zA-Z0-9\u0600-\u06FF]/g;
}
const e = <ClipboardEvent>event;
const pasteData = e.clipboardData.getData('text/plain');
let m;
let matches = 0;
while ((m = regex.exec(pasteData)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
matches++;
});
}
if (matches === pasteData.length) {
return;
} else {
e.preventDefault();
}
}
}
用法:
<input type="text" appInputRestriction="noSpecialChars" class="form-control-full" [(ngModel)]="noSpecialCharsModel" [ngModelOptions]="{standalone: true}" [disabled]="isSelected" required>
<input type="text" appInputRestriction="integer" class="form-control-full" [(ngModel)]="integerModel" [ngModelOptions]="{standalone: true}">
这实际上是我在 Whosebug 上的第一个答案,希望对您有所帮助。
您可以在输入标签中使用模式
适用于 angular7。
用于验证特殊字符
<input #Name="ngModel" type="text" name="Name" required maxlength="256" minlength="2"
[(ngModel)]="Name" class="validate form-control" pattern="^[a-zA-Z0-9]+$">
</div>
允许 Space
使用=>
pattern="^[a-zA-Z0-9 ]+$">
显示验证消息的完整用法:
<label for="Name" class="form-label">{{"Name" | localize}}*</label>
<div class="input-group"><input #dashboardName="ngModel" type="text" name="Name" required maxlength="256" minlength="2"
[(ngModel)]="Name" class="validate form-control" pattern="^[a-zA-Z0-9 ]+$">
</div>
<validation-messages [formCtrl]="Name"></validation-messages>
</div>
你也可以使用 Regex 模式
<md-input-container>
<input type="text" (ngModelChange)="omit_special_char($event)" mdInput name="name" [(ngModel)]="company.name" placeholder="Company Name" #name="ngModel" minlength="3" required>
</md-input-container>
public omit_special_char(e: any) {
try {
let k;
if (/^[a-zA-Z0-9\s]*$/.test(e.key)) {
return true;
} else {
e.preventDefault();
return false;
}
} catch (e) {
}
}
我是新手Angular 2. 我需要防止在输入字段中输入特殊字符。如果我输入字母数字,它必须接受它们,而特殊字符应该被阻止。有谁能帮忙吗
我在这里分享代码。
在HTML中:
<md-input-container>
<input type="text" (ngModelChange)="omit_special_char($event)" mdInput name="name" [(ngModel)]="company.name" placeholder="Company Name" #name="ngModel" minlength="3" required>
</md-input-container>
在 TS 中:
public e: any;
omit_special_char(val)
{
var k;
document.all ? k = this.e.keyCode : k = this.e.which;
return ((k > 64 && k < 91) || (k > 96 && k < 123) || k == 8 || k == 32 || (k >= 48 && k <= 57));
}
angular2 代码示例。
<input type="text" pattern="/[A-Z]{5}\d{4}[A-Z]{1}/i">
或
<md-input-container>
<input type="text" (keypress)="omit_special_char($event)" mdInput name="name" [(ngModel)]="company.name" placeholder="Company Name" #name="ngModel" minlength="3" required>
</md-input-container>
omit_special_char(val)
{
var k;
document.all ? k = this.e.keyCode : k = this.e.which;
return ((k > 64 && k < 91) || (k > 96 && k < 123) || k == 8 || k == 32 || (k >= 48 && k <= 57));
}
这里是纯 javascript 中的工作示例,因为 angular2/typescript 不支持 Whosebug。
function omit_special_char(e) {
var k;
document.all ? k = e.keyCode : k = e.which;
return ((k > 64 && k < 91) || (k > 96 && k < 123) || k == 8 || k == 32 || (k >= 48 && k <= 57));
}
<input type="text" onkeypress="return omit_special_char(event)"/>
您可以使用 ng-change 属性,然后调用 javascript 中的函数并在那里验证..
<md-input-container>
<input type="text" mdInput ng-change="myValidationFunction()" name="name" placeholder="Company Name" #name="ngModel" ng-model="name" minlength="3" required>
</md-input-container>
在javaScript中:
myValidateFunction()
{
if ($scope.name.matches("^[a-zA-Z0-9]+$")) {
return true;
}
else {
return false
}
}
根据函数结果你可以做你想做的...验证或禁止或者如果你想显示任何 CSS 消息那么你可以
您可以将 html5 模式验证器用作
<input type="text" (ngModelChange)="omit_special_char($event)" mdInput name="name" [(ngModel)]="company.name" placeholder="Company Name" #name="ngModel" minlength="3" required pattern="[a-zA-Z0-9]">
在表单中添加 novalidate 然后你可以显示相同的错误
<div *ngIf="name?.errors.pattern && name.dirty && name.invalid">Error Message</div>
你做的一切都是对的。只是功能需要稍微改变一下。您正在使用 ngModelChange 绑定不存在的事件。您可以使用 keypress 事件处理程序,如下所示。
HTML
<md-input-container>
<input type="text" (keypress)="omit_special_char($event)" mdInput name="name" [(ngModel)]="company.name" placeholder="Company Name" #name="ngModel" minlength="3" required>
</md-input-container>
组件
omit_special_char(event)
{
var k;
k = event.charCode; // k = event.keyCode; (Both can be used)
return((k > 64 && k < 91) || (k > 96 && k < 123) || k == 8 || k == 32 || (k >= 48 && k <= 57));
}
"event" 是您之前传递的“$event”本身的对象。试试这个,它肯定会与angular2一起使用。
我结合了这个帖子和其他帖子的几个答案,创建了我的自定义指令来处理手动输入和粘贴数据。
指令:
import { Directive, ElementRef, HostListener, Input } from '@angular/core';
@Directive({
selector: '[appInputRestriction]'
})
export class InputRestrictionDirective {
inputElement: ElementRef;
@Input('appInputRestriction') appInputRestriction: string;
arabicRegex = '[\u0600-\u06FF]';
constructor(el: ElementRef) {
this.inputElement = el;
}
@HostListener('keypress', ['$event']) onKeyPress(event) {
if (this.appInputRestriction === 'integer') {
this.integerOnly(event);
} else if (this.appInputRestriction === 'noSpecialChars') {
this.noSpecialChars(event);
}
}
integerOnly(event) {
const e = <KeyboardEvent>event;
if (e.key === 'Tab' || e.key === 'TAB') {
return;
}
if ([46, 8, 9, 27, 13, 110].indexOf(e.keyCode) !== -1 ||
// Allow: Ctrl+A
(e.keyCode === 65 && e.ctrlKey === true) ||
// Allow: Ctrl+C
(e.keyCode === 67 && e.ctrlKey === true) ||
// Allow: Ctrl+V
(e.keyCode === 86 && e.ctrlKey === true) ||
// Allow: Ctrl+X
(e.keyCode === 88 && e.ctrlKey === true)) {
// let it happen, don't do anything
return;
}
if (['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'].indexOf(e.key) === -1) {
e.preventDefault();
}
}
noSpecialChars(event) {
const e = <KeyboardEvent>event;
if (e.key === 'Tab' || e.key === 'TAB') {
return;
}
let k;
k = event.keyCode; // k = event.charCode; (Both can be used)
if ((k > 64 && k < 91) || (k > 96 && k < 123) || k === 8 || k === 32 || (k >= 48 && k <= 57)) {
return;
}
const ch = String.fromCharCode(e.keyCode);
const regEx = new RegExp(this.arabicRegex);
if (regEx.test(ch)) {
return;
}
e.preventDefault();
}
@HostListener('paste', ['$event']) onPaste(event) {
let regex;
if (this.appInputRestriction === 'integer') {
regex = /[0-9]/g;
} else if (this.appInputRestriction === 'noSpecialChars') {
regex = /[a-zA-Z0-9\u0600-\u06FF]/g;
}
const e = <ClipboardEvent>event;
const pasteData = e.clipboardData.getData('text/plain');
let m;
let matches = 0;
while ((m = regex.exec(pasteData)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
matches++;
});
}
if (matches === pasteData.length) {
return;
} else {
e.preventDefault();
}
}
}
用法:
<input type="text" appInputRestriction="noSpecialChars" class="form-control-full" [(ngModel)]="noSpecialCharsModel" [ngModelOptions]="{standalone: true}" [disabled]="isSelected" required>
<input type="text" appInputRestriction="integer" class="form-control-full" [(ngModel)]="integerModel" [ngModelOptions]="{standalone: true}">
这实际上是我在 Whosebug 上的第一个答案,希望对您有所帮助。
您可以在输入标签中使用模式 适用于 angular7。
用于验证特殊字符
<input #Name="ngModel" type="text" name="Name" required maxlength="256" minlength="2"
[(ngModel)]="Name" class="validate form-control" pattern="^[a-zA-Z0-9]+$">
</div>
允许 Space 使用=> pattern="^[a-zA-Z0-9 ]+$">
显示验证消息的完整用法:
<label for="Name" class="form-label">{{"Name" | localize}}*</label>
<div class="input-group"><input #dashboardName="ngModel" type="text" name="Name" required maxlength="256" minlength="2"
[(ngModel)]="Name" class="validate form-control" pattern="^[a-zA-Z0-9 ]+$">
</div>
<validation-messages [formCtrl]="Name"></validation-messages>
</div>
你也可以使用 Regex 模式
<md-input-container>
<input type="text" (ngModelChange)="omit_special_char($event)" mdInput name="name" [(ngModel)]="company.name" placeholder="Company Name" #name="ngModel" minlength="3" required>
</md-input-container>
public omit_special_char(e: any) {
try {
let k;
if (/^[a-zA-Z0-9\s]*$/.test(e.key)) {
return true;
} else {
e.preventDefault();
return false;
}
} catch (e) {
}
}