我正在尝试编辑一些现有的JavaScript验证代码。
使用onkeydown
事件,代码会检查文本框中的值是否超过最大长度。我无法使用<input maxlength="value" />
,因为字符串中可能有一些格式字符,我可以安全地从最大长度中排除。
除了用户按下插入键以打开改写类型并且它们已达到最大长度之外,代码工作正常。当发生这种情况时,如果他们将光标放在字符之前并尝试覆盖它,则验证会认为这将超出限制并且没有意识到字符实际将被替换。
此answer表示我无法检测是否打开了改写类型,但未提供任何引用。因此,假设我无法检测到改写类型,那么onkeydown
事件中是否存在检测字符是否将被替换的情况。
我对IE唯一解决方案感到满意。
更新:onblur
不合适,因为这会让他们超过限制多个字符,然后警告他们最大长度。我想阻止他们超越极限。
答案 0 :(得分:1)
您的处理程序应查看整个值并检查长度。如果长度合法,请返回。如果没有,您可以使用子字符串更新值。您可能必须使用插入位置来确定如何操作字符串,这可能很棘手,因为它在IE和其他浏览器中略有不同。
这与您现在所拥有的不同,可能会在达到最大长度时阻止按键。不要阻止按键,只需修剪结果字符串。
答案 1 :(得分:1)
我认为您的问题不在于onblur
验证,而是您在按键时按下它的声音调用的事件(例如,一旦达到限制就阻止用户再次按键)或者我误解了。
如果您的验证确实是onblur,您不必担心启用插入/覆盖等问题,您只对用户完成输入后input
元素的值感兴趣。
如果您试图在用户输入时达到此限制时停止用户,我会编写一个函数来计算您正在测试的实际长度。例如,
function validateMyInput() {
var myInputField = document.getElementById('myInput');
var removeAllExcludedCharsResult = myInputField.value.replace('&','');//exclude &
var totalLength = removeAllExcludedCharsResult.length;
if(totalLength < 500) { //limit of this test is 500
return true;
}
else {
return false;
}
}
显然,将此函数更改为您需要的函数,并通过传入输入元素,最大长度和排除字符数组以使其可重用,使其更通用。
<强>更新强>
我测试过这个问题是Chrome和插入密钥似乎被忽略了。 IE另一方面做得过头。但是,它似乎是页面特定的,例如,如果我在页面A上启用了插入,它似乎不会影响页面B.我发现this page似乎能够抓取键码事件,即使插入已经被迫了。可能是由于以下代码?
if(window.event) {
event = window.event; //where event is the javascript key event.
}
无论哪种方式,上面的链接似乎已经解决了问题,如果上述情况不正确,希望它能得到答案。
希望我没有误解问题是什么,这有帮助。