2011-11-09 70 views
1

我想编辑一些现有的JavaScript验证码。JavaScript最大长度验证与改写/插入键

使用onkeydown事件,代码将检查文本框中的值是否超过最大长度。我不能使用<input maxlength="value" />,因为字符串中可能有一些格式化字符,我可以安全地从最大长度中排除。

该代码工作良好,除了用户已经按下插入键以改变开式并且已达到最大长度。当发生这种情况时,如果他们将光标放在字符之前并尝试覆盖它,验证会认为这会超出限制,并且不会意识到字符实际上会被替换。

answer指出我无法检测到是否打开了类型,但不提供任何引用。因此,假设我无法检测到改写类型,那么在onkeydown事件中是否有检测角色是否将被替换的信息。

我很满意IE浏览器唯一的解决方案。

更新onblur是不合适的,因为这会让他们超过极限超过许多字符,然后警告他们的最大长度。我想阻止他们超过极限。

回答

1

您的处理程序应该查看整个值并检查长度。如果长度合法,则返回。如果不是,您可以使用子字符串更新值。您可能必须使用插入符的位置来确定如何操纵字符串,这在IE和其他浏览器中略有不同的情况下可能会非常棘手。

这与您现在所拥有的不同,当达到最大长度时可能会阻止按键。不要阻止按键,只是修剪生成的字符串。

+0

我更新了我的帖子,提到我实际上使用onkeydown。使用子字符串和脱字符位置只有在我可以确定(或假设)已打开重写类型时才有效。我不介意在达到最大长度时像处理文本框一样总是在打开文本框,但这种打破UI体验的方式是用户不会期望这种行为。 – row1

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; 
    } 

} 

此功能明显改变,你需要什么,也许是为了通过传递输入,最大长度和字符排除数组的元素,使之可重复使用更加通用。

UPDATE

我已经测试这个问题是Chrome和Insert键似乎被忽略。另一方面,IE覆盖。不过,它似乎是特定于页面的,例如,如果我已在页面A上启用插入,它似乎不会影响页面B.我发现this page即使按下插入,它似乎也能够获取键码事件。这可能是由于下面的代码?

if(window.event) { 
    event = window.event; //where event is the javascript key event. 
} 

不管怎样,上面的链接似乎已经占据了这个问题,希望这将有答案,如果上面的是不正确的。

希望我没有误解这个问题是什么,这有所帮助。

+0

我已更新我的帖子。我实际上想使用onkeydown而不是onblur,这样我就可以捕捉到用户超出限制的确切时刻。我现有的onkeydown看起来与您发布的内容类似,但这不适用于改写类型; – row1

+0

@ row1更新了anwser。希望有所帮助。 –