android微信keydown事件的keyCode为0情况下JS输入约束实现

因为微信不支持keypress事件,keydown/keyup的keycode又为0,没有办法通过这些事件事约束输入,所以,通过input事件变通实现。


原理很简单,每次输入时,记录下光标位置和上一次输入的值,再获取当前值时行检查,不合法时,恢复上次输入值,把光标设置到上一次的位置,由于number类型的input不支持获取和设置光标相关方法,因此,本方法只针对input类型为type的情况,实际上可以解决各种输入。


如里仅允许输入数字,且需要弹出数字键盘,可以通过input的pattern属性解决,例如要弹出数字键盘,pattern属性设置为【pattern="\d*"】


function getCursorPosition (ctrl) {
    var CaretPos = 0;   // IE Support
    if (document.selection) {
        ctrl.focus ();
        var Sel = document.selection.createRange ();
        Sel.moveStart ('character', -ctrl.value.length);
        CaretPos = Sel.text.length;
    }
    // Firefox support
    else if (ctrl.selectionStart || ctrl.selectionStart == '0')
        CaretPos = ctrl.selectionStart;
    return (CaretPos);
}


function setCursorPosition(ctrl, pos){
    if(ctrl.setSelectionRange)
    {
        ctrl.focus();
        ctrl.setSelectionRange(pos,pos);
    }
    else if (ctrl.createTextRange) {
        var range = ctrl.createTextRange();
        range.collapse(true);
        range.moveEnd('character', pos);
        range.moveStart('character', pos);
        range.select();
    }
}


function isNumberString(str) {
    return str.match("^[0-9]*$");
}

addEvent(document.querySelectorAll(".js_number"), "input", function () {
    var cursorPos = getCursorPosition(this) - 1;
    var orgValue = this.getAttribute("org_value");
    if (isEmpty(orgValue)) {
        orgValue = "";
    }
    var value = this.value;
    if (!isNumberString(value)) {
        this.value = orgValue;
        setCursorPosition(this, cursorPos);
        return;
    }


    var maxLength = this.getAttribute("maxlength");
    if (maxLength != undefined && maxLength != null) {
        if (value.length > maxLength) {
            this.value = orgValue;
            setCursorPosition(this, cursorPos);
            return;
        }
    }


    this.setAttribute("org_value", value);
});


var addEvent = (function () {
    if (document.addEventListener) {
        return function (el, type, fn) {
            if (!el) {
                return false;
            }
            //el.addEventListener(type, fn, false);
            var objs = [];
            if (Object.prototype.toString.apply(el) == "[object NodeList]") {
                objs = el;
            }
            else {
                objs[0] = el;
            }

            for (var i = 0; i < objs.length; i++) {
                objs[i].addEventListener(type, fn, false);
            }
        };
    } else {
        return function (el, type, fn) {
            if (!el) {
                return false;
            }
            //el.attachEvent('on' + type, function () {
            //    return fn.call(el, window.event);
            //});
            var objs = [];
            if (Object.prototype.toString.apply(el) == "[object NodeList]") {
                objs = el;
            }
            else {
                objs[0] = el;
            }

            for (var i = 0; i < objs.length; i++) {
                objs[i].attachEvent('on' + type, function () {
                    return fn.call(el, window.event);
                });
            }
        }
    }
})();




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值