做老项目兼容EDGE浏览器时,遇到IE下ime-mode: disabled"可以限制用户不允许输入中文,但EDGE浏览器不支持。研究了数个星期写出了下面的方法。但是这个方法有一个致命缺点就是使用中文输入法输入字母时会导致输入框闪烁。如果有js大神有其他解决方法或者更好的方法请告知。
var beginIndex = 0;
var inputId = null;
var intervalId = null;
var endIndex = 0;
//只允许输入数字和字母
//max 允许输入的最大长度。
function inputkeydownNAK(max) {
if (event.keyCode == 229) {
var txb = event.srcElement;
var start = txb.selectionStart;
var end = txb.selectionEnd;
beginIndex = start;
endIndex = end;
inputId = txb.getAttribute("id");
console.log(event.code);
if ((event.code.indexOf("Digit") == -1) && (event.code.indexOf("Numpad") == -1) && (event.code < "KeyA" || event.code > "KeyZ")) {
txb.disabled = "disabled";
txb.blur();
if (intervalId == null) {
intervalId = setInterval(function () {
if (inputId != undefined && inputId != null) {
var inputobj = document.getElementById(inputId);
inputobj.disabled = "";
inputobj.focus();
inputobj.selectionStart = beginIndex;
inputobj.selectionEnd = beginIndex;
}
clearInterval(intervalId);
intervalId = null;
}, 100);
}
} else {
if ((event.code >= "KeyA" && event.code <= "KeyZ")) {
txb.disabled = "disabled";
code = event.code;
if (intervalId == null) {
intervalId = setInterval(function () {
if (inputId != undefined && inputId != null) {
var inputobj = document.getElementById(inputId);
var temp = inputobj.value;
if (temp.length - (endIndex - beginIndex) < max) {
inputobj.value = temp.substring(0, beginIndex) + code.replace("Key", "").toLowerCase() + temp.substring(endIndex, temp.length);
inputobj.disabled = "";
inputobj.focus();
inputobj.selectionStart = beginIndex + 1;
inputobj.selectionEnd = beginIndex + 1;
} else {
inputobj.disabled = "";
inputobj.focus();
inputobj.selectionStart = beginIndex;
inputobj.selectionEnd = beginIndex;
}
clearInterval(intervalId);
intervalId = null;
}
}, 100);
}
} else {
if (start != end) {
} else {
if (txb.value.length >= max) {
txb.disabled = "disabled";
if (intervalId == null) {
intervalId = setInterval(function () {
if (inputId != undefined && inputId != null) {
var inputobj = document.getElementById(inputId);
inputobj.disabled = "";
inputobj.focus();
inputobj.selectionStart = beginIndex;
inputobj.selectionEnd = beginIndex;
clearInterval(intervalId);
intervalId = null;
}
}, 100);
}
}
}
}
}
}
else if (event.keyCode == 110 || event.keyCode == 190 || event.keyCode == 108 || event.keyCode == 27 || event.keyCode == 9 || event.keyCode == 8 || event.keyCode == 46 || (event.keyCode <= 105 && event.keyCode >= 96) || (event.keyCode <= 57 && event.keyCode >= 48) || (event.keyCode <= 90 && event.keyCode >= 65) ) {
inputId = null;
return true;
}
else {
inputId = null;
return false;
}
}