因为微信不支持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);
});
}
}
}
})();