如果它是rtl或ltr,我将测试插入的字符并使用此代码:
function checkRTL(s) {
var ltrChars = 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-
\u1FFF' + '\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF',
rtlChars = '\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC',
rtlDirCheck = new RegExp('^[^' + ltrChars + ']*[' + rtlChars + ']');
return rtlDirCheck.test(s);
}
;
function checkSpecialChars(s) {
var sChars = '0-9`~!@#$%^&*()_+\\-=\\|\\[\\]{};\'":,.<>/',
checkChar = new RegExp('^[' + sChars + ']+');
return checkChar.test(s);
}
var input = $('#password').on('keypress', keypress);
function keypress(e) {
setTimeout(function () {
var isRTL = checkRTL(String.fromCharCode(e.charCode));
var isSpecial = checkSpecialChars(String.fromCharCode(e.charCode));
var dir = isRTL ? 'RTL' : 'LTR';
if(dir=='RTL'){
document.getElementById("langDir").innerHTML="<img src='../img
/signup_images/att.png'>Hello!";
$("#langDir").css("display","block");
}
else
{
document.getElementById("langDir").innerHTML="";
$("#langDir").css("display","none");
}
}, 100);
}
此代码在IE 9,10,Chrome和Firefox中运行良好。 但它在IE8中不起作用 经过一些调试后我发现了这一行:
rtlDirCheck = new RegExp('^[^' + ltrChars + ']*[' + rtlChars + ']');
return rtlDirCheck.test(s);
始终返回False。 这有什么问题?
答案 0 :(得分:1)
首先,我发现你的正则表达式没有任何问题。另外使用以下html IE 7到10总是告诉我结果等于true(我在向后兼容模式下使用IE 10.0)。
<html>
<body>
<script>
var ltrChars = 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF' + '\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF',
rtlChars = '\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC',
rtlDirCheck = new RegExp('^[^' + ltrChars + ']*[' + rtlChars + ']');
alert("result = "+ rtlDirCheck.test('\u0591') );
</script>
</body>
</html>
问题不在于此功能。它很可能是它的输入:
String.fromCharCode(e.charCode)
IE不设置e.charCode,但使用了e.keyCode。实际上,e.charCode仅供webkit浏览器使用。在不同浏览器中查看键盘事件之间所有差异的优秀breakdown的第3章。我建议使用:
String.fromCharCode(e.which || e.keyCode)