【发布时间】:2014-12-05 18:56:59
【问题描述】:
我不希望用户在文本字段中输入空格。我不希望在提交验证时使用它,而是在他们单击时文本字段上不会出现空格。
【问题讨论】:
-
到目前为止你尝试过什么?我建议您编写一个自定义指令,在 keydown 上监视 keyCode 并采取适当的措施。
标签: angularjs angularjs-directive
我不希望用户在文本字段中输入空格。我不希望在提交验证时使用它,而是在他们单击时文本字段上不会出现空格。
【问题讨论】:
标签: angularjs angularjs-directive
选择的答案可以说不是很unobtrusive。如果你需要在多个地方使用它,你最终会得到重复的代码。
我更喜欢使用以下指令来防止输入空格。
app.directive('disallowSpaces', function() {
return {
restrict: 'A',
link: function($scope, $element) {
$element.bind('input', function() {
$(this).val($(this).val().replace(/ /g, ''));
});
}
};
});
这个指令可以这样调用:
<input type="text" disallow-spaces>
【讨论】:
input 事件:)。但是,此解决方案的问题在于,如果您尝试更改中间或开头的文本,它会将光标置于字符串的末尾。我最终做的是从另一个类似问题中获取您的初始解决方案 + 解决方案:plnkr.co/edit/BqPFIMDfO2HtlERL9QWk?p=preview。似乎工作
<input ng-model="field" ng-trim="false" ng-change="field = field.split(' ').join('')" type="text">
更新: 为了提高代码质量,您可以创建自定义指令。但不要忘记,您的指令不仅要阻止来自键盘的输入,还要阻止粘贴。
<input type="text" ng-trim="false" ng-model="myValue" restrict-field="myValue">
在此处添加 ng-trim="false" 属性以禁用对输入的修剪很重要。
angular
.module('app')
.directive('restrictField', function () {
return {
restrict: 'AE',
scope: {
restrictField: '='
},
link: function (scope) {
// this will match spaces, tabs, line feeds etc
// you can change this regex as you want
var regex = /\s/g;
scope.$watch('restrictField', function (newValue, oldValue) {
if (newValue != oldValue && regex.test(newValue)) {
scope.restrictField = newValue.replace(regex, '');
}
});
}
};
});
【讨论】:
replace(),为什么还要使用split() 后跟join()?
如果你想在不写指令的情况下实现它
ng-keydown="$event.keyCode != 32 ? $event:$event.preventDefault()"
【讨论】:
Jason 写的指令对我不起作用。我不得不将 return false 更改为:e.preventDefault() 像这样:
app.directive('disallowSpaces', function() {
return {
restrict: 'A',
link: function($scope, $element) {
$element.bind('keydown', function(e) {
if (e.which === 32) {
e.preventDefault();
}
});
}
}
});
【讨论】:
这可以防止输入任何特殊字符,包括空格:
app.directive('noSpecialChar', function() {
return {
require: 'ngModel',
restrict: 'A',
link: function(scope, element, attrs, modelCtrl) {
modelCtrl.$parsers.push(function(inputValue) {
if (inputValue == null)
return ''
let cleanInputValue = inputValue.replace(/[^\w]|_/gi, '');
if (cleanInputValue != inputValue) {
modelCtrl.$setViewValue(cleanInputValue);
modelCtrl.$render();
}
return cleanInputValue;
});
}
}
});
【讨论】:
不使用 jquery
angular.module('app').directive('disallowSpaces', function () {
return {
restrict: 'A',
require: 'ngModel',
scope: {
maxvalue: '=',
},
link: function ($scope, $element, attr, ngModelCtrl) {
$element.bind('keydown', function () {
function transformer(text) {
if (text) {
var transformedInput = text.replace(/ /g, '');
ngModelCtrl.$setViewValue(transformedInput);
ngModelCtrl.$render();
return transformedInput;
}
return undefined;
}
ngModelCtrl.$parsers.push(transformer);
});
},
};
});
// use disallow-spaces
<input type="text" ng-model="name" disallow-spaces />
【讨论】:
您无需编写指令即可实现此目的。
<input ng-model="myModel" ng-keydown="$event.keyCode != 32 ? $event:$event.preventDefault()">
【讨论】:
对于 Angular 9,不支持键码。
下面的代码可以帮助你。
keyDownHandler(事件) {
if (event.code === 'Space') {
event.preventDefault();
}
}
【讨论】: