我正在尝试在用户输入框中编写一个验证,其中允许使用字母数字值以及一些特殊字符。如果用户输入了我的应用程序不支持的特殊字符,我试图显示一条错误消息。
var inputKey = "abcdfg34$@!"
所以在第一个位置我正在做一个过滤器来从这个字符串中获取特殊的字符
var inp = inputKey.replace(/[a-zA-Z0-9]/g, ''); // Now ip = @!
$ scope.specialchar包含允许的spl char列表
$scope.specialchar = [@,#,$,%,<,^,<];
for(var i in $rootScope.specialChar ){
if(( inp.indexOf($scope.specialChar[i].value) > -1 ))
{
$scope.charAllowedText = true;
count++;
}
}
if(count == 0) - display error messagae
因此,如果第一个spl char的出现是未列出的那个,则上面的代码工作正常。以上示例show(!)未列出但由于我的字符串包含@!条件(count == 0)失败。我想再次打印用户在错误提示时输入的特殊字符。
我做错了什么?
答案 0 :(得分:0)
首先,在设置$scope.specialChar
时,数组中的每个字符都应该用引号括起来,以便将其作为字符串读取:
$scope.specialchar = ['@', '#', '$', '%', '<', '^', '<'];
其次,在检查输入是否包含某个特殊字符时,您应该只使用$scope.specialChar[i]
(不使用.value
,因为您尝试仅访问数组中的元素,而不是该元素的value
属性。)
inp.indexOf($scope.specialChar[i]) > -1)
答案 1 :(得分:0)
使用此指令代替上面的代码..
angular.module('test')
.directive('validChar', function() {
return {
require: '?ngModel',
link: function(scope, element, attrs, ngModelCtrl) {
if(!ngModelCtrl) {
return;
}
ngModelCtrl.$parsers.push(function(val) {
if (angular.isUndefined(val)) {
val = '';
}
var clean = val.replace( /[a-zA-Z0-9]/g, '');
if (val !== clean) {
ngModelCtrl.$setViewValue(clean);
ngModelCtrl.$render();
}
return clean;
});
element.bind('keypress', function(event) {
if(event.keyCode === 32) {
event.preventDefault();
}
});
}
};
});
答案 2 :(得分:0)
var allowed=['-','@'];
var regex=new RegExp('[a-z0-9'+allowed.join('')+']','ig');
var tests=[
"holi-java",
"@name",
"@-#$@"
];
tests.forEach(function(test){
console.log(JSON.stringify(test)+" disallowed chars were:"+JSON.stringify(test.replace(regex,'')));
});
var allowed=['-','@'];
var tests=[
"holi-java",
"@name",
"@-#$@"
];
function disallowed(input){
var rest=input.replace(/[a-z0-9]/g,'');
var disallowed=[];
for(var i in rest){
if(allowed.indexOf(rest[i])==-1)
disallowed.push(rest[i]);
}
return disallowed;
}
tests.forEach(function(test){
console.log(JSON.stringify(test)+" disallowed chars were:"+JSON.stringify(disallowed(test)));
});