Limit input to numbers and . on input field

前端 未结 3 1141
深忆病人
深忆病人 2021-01-02 10:55

Following on from another question I asked, i really didnt seem to be getting anywhere. Due to my ineptitude. I chose the guys answer because , well he answered my question.

3条回答
  •  灰色年华
    2021-01-02 11:28

    Here is my solution(It also validates data/values copy&pasted):

    function InputValidator(input, validationType, validChars) {
    if (input === null || input.nodeType !== 1 || input.type !== 'text' && input.type !== 'number')
        throw ('Please specify a valid input');
    
    if (!(InputValidator.ValidationType.hasOwnProperty(validationType) || validationType))
        throw 'Please specify a valid Validation type';
    
    input.InputValidator = this;
    
    input.InputValidator.ValidCodes = [];
    
    input.InputValidator.ValidCodes.Add = function (item) {
        this[this.length] = item;
    };
    
    input.InputValidator.ValidCodes.hasValue = function (value, target) {
        var i;
        for (i = 0; i < this.length; i++) {
            if (typeof (target) === 'undefined') {
                if (this[i] === value)
                    return true;
            }
            else {
                if (this[i][target] === value)
                    return true;
            }
        }
    
        return false;
    };
    
    var commandKeys = {
        'backspace': 8,
        'tab': 9,
        'enter': 13,
        'shift': 16,
        'ctrl': 17,
        'alt': 18,
        'pause/break': 19,
        'caps lock': 20,
        'escape': 27,
        'page up': 33,
        'page down': 34,
        'end': 35,
        'home': 36,
        'left arrow': 37,
        'up arrow': 38,
        'right arrow': 39,
        'down arrow': 40,
        'insert': 45,
        'delete': 46,
        'left window key': 91,
        'right window key': 92,
        'select key': 93,
        /*creates Confusion in IE */
        //'f1': 112,
        //'f2': 113,
        //'f3': 114,
        //'f4': 115,
        //'f5': 116,
        //'f6': 117,
        //'f7': 118,
        //'f8': 119,
        //'f9': 120,
        //'f10': 121,
        //'f11': 122,
        //'f12': 123,
        'num lock': 144,
        'scroll lock': 145,
    };
    
    commandKeys.hasValue = function (value) {
        for (var a in this) {
            if (this[a] === value)
                return true;
        }
    
        return false;
    };
    
    function getCharCodes(arrTarget, chars) {
        for (var i = 0; i < chars.length; i++) {
            arrTarget.Add(chars[i].charCodeAt(0));
        }
    }
    
    function triggerEvent(name, element) {
        if (document.createEventObject) {
            // dispatch for IE
            var evt = document.createEventObject();
            return element.fireEvent('on' + name, evt)
        }
        else {
            // dispatch for firefox + others
            var evt = document.createEvent("HTMLEvents");
            evt.initEvent(name, true, true); // event type,bubbling,cancelable
            return !element.dispatchEvent(evt);
        }
    }
    
    if (validationType == InputValidator.ValidationType.Custom) {
        if (typeof (validChars) === 'undefined')
            throw 'Please add valid characters';
    
        getCharCodes(input.InputValidator.ValidCodes, validChars);
    }
    else if (validationType == InputValidator.ValidationType.Decimal) {
        getCharCodes(input.InputValidator.ValidCodes, '0123456789.');
    }
    else if (validationType == InputValidator.ValidationType.Numeric) {
        getCharCodes(input.InputValidator.ValidCodes, '0123456789');
    }
    
    input.InputValidator.ValidateChar = function (c) {
        return this.ValidCodes.hasValue(c.charCodeAt(0));
    }
    
    input.InputValidator.ValidateString = function (s) {
        var arr = s.split('');
    
        for (var i = 0; i < arr.length; i++) {
            if (!this.ValidateChar(arr[i])) {
                arr[i] = '';
            }
        }
    
        return arr.join('');
    }
    
    function bindEvent(el, eventName, eventHandler) {
        if (el.addEventListener) {
            el.addEventListener(eventName, eventHandler, false);
        } else if (el.attachEvent) {
            el.attachEvent('on' + eventName, eventHandler);
        }
    }
    
    function getCaretPosition(i) {
        if (!i) return;
    
        if ('selectionStart' in i) {
            return i.selectionStart;
        }
        else {
            if (document.selection) {
                var sel = document.selection.createRange();
                var selLen = document.selection.createRange().text.length;
                sel.moveStart('character', -i.value.length);
                return sel.text.length - selLen;
            }
        }
    }
    
    function setCursor(node, pos) {
        var node = (typeof (node) === "string" || node instanceof String) ? document.getElementById(node) : node;
    
        if (!node) {
            return false;
        }
        else if (node.createTextRange) {
            var textRange = node.createTextRange();
            textRange.collapse(true);
            textRange.moveEnd(pos);
            textRange.moveStart(pos);
            textRange.select();
            return true;
        } else if (node.setSelectionRange) {
            node.setSelectionRange(pos, pos);
            return true;
        }
    
        return false;
    }
    
    function validateActive() {
        if (input.isActive) {
            var pos = getCaretPosition(input);
    
            var arr = input.value.split('');
    
            for (var i = 0; i < arr.length; i++) {
                if (!this.ValidateChar(arr[i])) {
                    arr[i] = '';
    
                    if (pos > i)
                        pos--;
                }
            }
            console.log('before : ' + input.value);
    
            input.value = arr.join('');
            console.log('after : ' + input.value, input);
            setCursor(input, pos);
    
            setTimeout(validateActive, 10);
        }
    }
    
    bindEvent(input, 'keypress', function (e) {
        var evt = e || window.event;
        var charCode = evt.which || evt.keyCode;
    
        if (!input.InputValidator.ValidCodes.hasValue(charCode) && !commandKeys.hasValue(charCode)) {
            if (evt.preventDefault) {
                evt.preventDefault();
                evt.stopPropagation();
            }
            return false;
        }
    });
    
    bindEvent(input, 'keyup', function (e) {
        var evt = e || window.event;
        var charCode = evt.which || evt.keyCode;
    
        if (!input.InputValidator.ValidCodes.hasValue(charCode) && !commandKeys.hasValue(charCode)) {
            if (evt.preventDefault) {
                evt.preventDefault();
                evt.stopPropagation();
            }
            return false;
        }
    });
    
    bindEvent(input, 'change', function (e) {
        var dt = input.value;
    
        input.value = input.InputValidator.ValidateString(input.value);
    
        if (input.value !== dt)
            triggerEvent('change', input);
    });
    
    bindEvent(input, 'blur', function (e) {
        var dt = input.value;
        input.value = input.InputValidator.ValidateString(input.value);
    
        input.isActive = false;
    
        if (input.value !== dt)
            triggerEvent('blur', input);
    });
    
    bindEvent(input, 'paste', function (e) {
        var evt = e || window.event;
        var svt = input.value;
    
        if (evt && evt.clipboardData && evt.clipboardData.getData) {// Webkit - get data from clipboard, put into editdiv, cleanup, then cancel event
            if (/text\/html/.test(evt.clipboardData.types)) {
                var dt = evt.clipboardData.getData('text/html');
    
                input.value = input.InputValidator.ValidateString(dt);
                if (input.value !== dt)
                    triggerEvent('change', input);
            }
            else if (/text\/plain/.test(e.clipboardData.types)) {
                var dt = evt.clipboardData.getData('text/plain');
    
                input.value = input.InputValidator.ValidateString(dt);
                if (input.value !== dt)
                    triggerEvent('change', input);
            }
            else {
                input.value = '';
            }
            waitforpastedata(input, svt);
            if (e.preventDefault) {
                e.stopPropagation();
                e.preventDefault();
            }
            return false;
        }
        else {// Everything else - empty editdiv and allow browser to paste content into it, then cleanup
            input.value = '';
            waitforpastedata(input, svt);
            return true;
        }
    });
    
    bindEvent(input, 'select', function (e) {
        var evt = e || window.event;
    
        if (evt.preventDefault) {
            evt.preventDefault();
            evt.stopPropagation();
        }
        return false;
    });
    
    bindEvent(input, 'selectstart', function (e) {
        var evt = e || window.event;
    
        if (evt.preventDefault) {
            evt.preventDefault();
            evt.stopPropagation();
        }
        return false;
    });
    
    /* no need to validate wile active,
       removing F keys fixed IE compatability*/
    //bindEvent(input, 'fucus', function (e) {
    //    input.isActive = true;
    //    validateActive();
    //});
    
    //validate current value of the textbox
    {
        var dt = input.value;
        input.value = input.InputValidator.ValidateString(input.value);
    
        //trigger event to indicate value has changed
        if (input.value !== dt)
            triggerEvent('change', input);
    }
    
    function waitforpastedata(elem, savedcontent) {
        if (elem.value !== '') {
            var dt = input.value;
            elem.value = elem.InputValidator.ValidateString(elem.value);
    
            if (input.value !== dt)
                triggerEvent('change', input);
        }
        else {
            var that = {
                e: elem,
                s: savedcontent
            }
            that.callself = function () {
                waitforpastedata(that.e, that.s)
            }
            setTimeout(that.callself, 10);
        }
    }
    }
    
    InputValidator.ValidationType = new (function (types) {
        for (var i = 0; i < types.length; i++) {
            this[types[i]] = types[i];
        }
    })(['Numeric', 'Custom', 'Decimal']);
    

    To apply it to an input, do the following :

    new InputValidator(document.getElementById('txtValidate'), InputValidator.ValidationType.Decimal);/* Numeric or Custom */
    

    If you specify Custom as the validation type you have to specify the valid characters. eg :

    new InputValidator(document.getElementById('txtValidate'), InputValidator.ValidationType.Custom,'1234abc');
    

提交回复
热议问题