0

I have restrict for a text field in html.In this way went to developed a directive for allow only numbers even copy and paste also restriction.but I am getting some problem when copy and paste a number even though not allowing.because last keyup in ctrl+v is v thats why not allowing.I used below code.I wanna some condition based allowed to alphabet thats why I used type="text".

enter link description here

<input type="text" min="0" name="inputName" ng-model="myModel" dl-enter-Num="closeModalWindow();" >

app.directive('dlEnterNum', function() {
    return function($scope, element, attrs) {
        element.bind("keydown keypress paste", function(event) {
            var keyCode = event.which || event.keyCode;
            if($scope.documentTypeNumber==1 || $scope.documentTypeNumber ==2){
                var keys={
                        'up': 38,'right':39,'down':40,'left':37,'space':8,'ctrl':17,
                        'escape':27,'tab':9,'enter':13,'del':46,
                        '0':48,'1':49,'2':50,'3':51,'4':52,'5':53,'6':54,'7':55,'8':56,'9':57
                    };
                    for(var index in keys) {
                        if (!keys.hasOwnProperty(index)) continue;
                        if (event.charCode==keys[index]||keyCode==keys[index]) {
                            if(keyCode==39 || keyCode==46 || keyCode==38 || keyCode==37 || keyCode==40 || keyCode==64){

                            }else{
                            return; //default event
                            }
                        }
                    }   
                    event.preventDefault();
            }else if($scope.documentTypeNumber==6){
                if (event.shiftKey && event.keyCode < 65 && event.keyCode > 90) {
                    event.preventDefault();
                }
                if (event.keyCode == 46 ||  (event.keyCode>90 && event.keyCode<97)) {
                    event.preventDefault();
                }
                else {
                    if (event.keyCode < 65) {
                        if ((event.keyCode != 32 && event.keyCode < 44) || event.keyCode > 57 || event.keyCode ==46 || event.keyCode ==47) {
                            event.preventDefault();
                        }
                    }
                    else {
                        if (event.keyCode < 65 || event.keyCode > 122) {
                            event.preventDefault();
                        }
                    }
                }
            }
        });
    };
});
5
  • Yes you can use a regex to do that! Commented Jun 10, 2017 at 12:21
  • can u suggest how to use regex in above directive for numbers. Commented Jun 10, 2017 at 12:22
  • 1
    Note that one event named "input" will cover the 3 events shown Commented Jun 10, 2017 at 12:24
  • @Maxi You want numbers or letters? I don't understand! Commented Jun 10, 2017 at 12:24
  • if $scope.documentTypeNumber==1 || $scope.documentTypeNumber==2.in this case want to allow numbers only.but $scope.documentTypeNumber==6 in this case aloow lettrs Commented Jun 10, 2017 at 12:26

1 Answer 1

1

This is the best you can do

.directive("dlEnterNum", ["$timeout", function ($timeout) {
    return {
        restrict: "A",
        scope: false,
        link: function (scope, element) {
            var ctrlDown = false,
                ctrlKey = 17,
                cmdKey = 91,
                vKey = 86,
                cKey = 67;

            $(document).off("keydown.enterNum").on("keydown.enterNum", function (e) {
                if (e.keyCode == ctrlKey || e.keyCode == cmdKey) ctrlDown = true;
            }).off("keyup.enterNum").on("keyup.enterNum", function (e) {
                if (e.keyCode == ctrlKey || e.keyCode == cmdKey) ctrlDown = false;
            });

            var pasting = function (keyCode) {
                return ctrlDown && (keyCode == vKey || keyCode == cKey);
            };

            var isDigit = function (keyCode) {
                return (keyCode >= 48 && keyCode <= 57) || (keyCode >= 96 && keyCode <= 105);
            };

            var noCharKeys = {
                up: 38,
                right: 39,
                down: 40,
                left: 37,
                backspace: 8,
                space: 32,
                escape: 27,
                tab: 9,
                enter: 13,
                del: 46
            };

            element.on("keydown", function (event) {
                var keyCode = event.which || event.keyCode;
                console.info("DOCUMENT TYPE: " + scope.documentTypeNumber);
                console.info("KEY CODE: " + keyCode);
                switch (scope.documentTypeNumber) {
                    case 1:
                    case 2:
                    {
                        //CHECK IF ALL DIGITS AFTER PASTE
                        if (pasting(keyCode)) {

                            $timeout(function () {
                                var isNumeric = /^\d+$/.test(scope.myModel);
                                if (!isNumeric) {
                                    scope.myModel = "";
                                }
                            });

                            return true;
                        }

                        //CHECK FOR DIGITS INPUT
                        if (!isDigit(keyCode)) {
                            event.preventDefault();
                        }

                        break;

                    }
                    case 6:
                    {
                        if (pasting(keyCode)) {

                            $timeout(function () {
                                var isAlphabetic = /^[A-Za-z]+$/.test(scope.myModel);
                                if (!isAlphabetic) {
                                    scope.myModel = "";
                                }
                            });

                            return true;
                        }

                        //CHECK FOR DIGITS INPUT
                        if (isDigit(keyCode)) {
                            event.preventDefault();
                        }

                        break;
                    }
                } //SWITCH CLOSING BRACKET

                //CHECK FOR OTHER KEYS
                for (var key in noCharKeys) {
                    if (event.charCode == noCharKeys[key] || keyCode == noCharKeys[key]) {
                        event.preventDefault();
                    }
                }

            });
        }
    };
}]);

EDIT-1 13/06:

working fiddle ==> https://jsfiddle.net/tonysamperi/gbzu9d8r/

Sign up to request clarification or add additional context in comments.

6 Comments

No.the above code allows some conditions.for example $scope.documentTypeNumber==6 in this case we allow to alphabet so,ng-pattern not working
In that am getting type of document.if 1 or 2 then allow numbers else 6 then allow alphabets.
when we click 1 and 2 option then allow numbers only with copy and paste also
Hi Tony,when am paste alphabetic in that also paste fucntionality working when 1 0r 2
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.