2016-03-18 3 views
0

Мне нужно разрешить пользователю вводить только цифры. Вот что я сделал.Предотвращение ввода пользователем ввода без номера

Порция шаблоне директивы:

<input type="text" maxlength="5" ng-keypress="allowNumbers($event)"> 

Функция в моей директиве:

$scope.allowNumbers= function (ev) { 
    var key = ev.charCode || ev.keyCode || 0; 
    var allowed = (
     key == 8 || 
     key == 9 || 
     key == 13 || 
     key == 46 || 
     key == 110 || 
     key == 190 || 
     (key >= 35 && key <= 40) || 
     (key >= 48 && key <= 57) || 
     (key >= 96 && key <= 105)); 

    return allowed; 
}; 

Во время отладки, я заметил, что даже функция возвращает true или false, значение в текстовом поле действительно становится Введенный , Могу ли я каким-то образом предотвратить это для немедленного нажатия клавиши?

+0

Возможный дубликат [Запретить ввод чисел без номера в номере типа ввода] (http://stackoverflow.com/questions/19966417/prevent-typing-non-numeric-in-input-type-number) – MysterX

+0

Является ли ваша функция с именем 'allowNumbers' или' allowNumberOnly'? –

+0

попробуйте использовать 'if (! Allowed) ev.preventDefault();' – zooblin

ответ

3

я бы подойти к этому проще, и таким образом, что гарантированно поймать больше возможных форм ввода (например, копипаст):

<input type="number" ng-model="myNumber"> 

$scope.$watch('myNumber', function (input) { 
    $scope.myNumber = input.replace(/\D/g, ''); 
}); 
+0

Если пользователь скопирует и вставляет данные типа «asdd1as3asd3», результат согласно описанной логике будет 133. Я не думаю, что это намерение запроса. – Harpreet

+1

Почему бы и нет? Что делать * в этом случае? Вход только разрешается состоять из чисел, и удаление всех не-чисел кажется мне вполне разумным. – deceze

2
function IsNumeric(e) { 

var keyCode = e.keyCode == 0 ? e.charCode : e.keyCode; 
var ret = ((keyCode >= 48 && keyCode <= 57) || (specialKeys.indexOf(e.keyCode) != -1 && e.charCode != e.keyCode)); 
// document.getElementById("error").style.display = ret ? "none" : "inline"; 
return ret; 
} 

и в HTML

 <input type="text" onkeypress="return IsNumeric(event);" /> 
+0

Спасибо за ответ – benjamin54

4

Вы можете использовать directive:

angular.module('myApp', []).directive('numbersOnly', function(){ 
    return { 
     require: 'ngModel', 
     link: function(scope, element, attrs, modelCtrl) { 
      modelCtrl.$parsers.push(function (inputValue) { 
       if (!inputValue) return '' 
       var transformedInput = inputValue.replace(/[^0-9]/g, ''); 
       if (transformedInput !== inputValue) { 
        modelCtrl.$setViewValue(transformedInput); 
        modelCtrl.$render(); 
       } 

       return transformedInput; 
      }); 
     } 
    }; 
}); 

И использовать его как это:

<input type="text" maxlength="5" numbers-only/> 

Вы можете использовать это поведение в любой вход, необходимое, просто добавив атрибут numbers-only.

См. working JSFiddle.

+0

Ваше решение хорошее, за исключением одной вещи. Если курсор находится в середине номера, введите букву (а не цифры), курсор переместится в конец ** **. –

+0

Спасибо за ответ – benjamin54

Смежные вопросы