以下是我正在使用的验证方法的示例:
if(currentFieldCategory=='e')
{
var atpos=currentFieldValue.indexOf("@");
var dotpos=currentFieldValue.lastIndexOf(".");
if (atpos<1 || dotpos<atpos+2 || dotpos+2>=currentFieldValue.length)
{
echo('Please enter a valid email address');
currentField.focus();
return 'Please enter a valid email address';
}
}
如果用户未输入有效的电子邮件,则会触发错误消息。使用currentField.focus();焦点将保留在当前正在验证的文本框中,但所有其他文本框都将被锁定,直到输入正确的数据。
我想知道是否有办法将焦点保持在当前文本框而不锁定其他文本框(即用户仍然可以单击其他文本框)。由于我的验证同时适用于用户输入和表单提交,因此即使当前文本框中不包含正确的数据,用户也可以单击其他文本框。
有人可以帮忙吗?
谢谢,
尼克
答案 0 :(得分:0)
您的要求似乎是矛盾的:您无法在一个输入中“保持焦点”,同时允许用户点击其他输入。
更常见的验证技术是onchange
或onblur
如果特定字段验证失败,则将其背景设置为不同的颜色,和/或在其旁边显示错误消息。然后,用户知道他们需要返回哪些字段,但他们仍然可以自由地首先进入其他字段。
话虽如此,如果您真的热衷于焦点想法,也许您只能在用户第一次尝试离开现场时设置焦点。如果他们试图再次允许它离开现场。
// global (or at least a higher scope variable) to keep track of which
// fields have failed; I assume your fields all have IDs set
var invalidFields = {};
// within your validation function
if(currentFieldCategory=='e')
{
var atpos=currentFieldValue.indexOf("@");
var dotpos=currentFieldValue.lastIndexOf(".");
if (atpos<1 || dotpos<atpos+2 || dotpos+2>=currentFieldValue.length)
{
echo('Please enter a valid email address');
// NEW IF TEST
// only set focus if this field didn't already fail validation
if (!invalidFields[currentField.id]) {
invalidFields[currentField.id] = true;
currentField.focus();
}
return 'Please enter a valid email address';
}
invalidFields[currentField.id] = false;
}
注意:如果!invalidFields[currentField.id]
没有为currentField的id定义一个键,或者它确实有一个键,那么新的if测试invalidFields
中的表达式将为true使用相应的false值定义。即,如果以前从未验证过,或者上次验证它已通过。
(顺便说一下,你应该研究用正则表达式验证格式,而不是手动比较第一个“@”和最后一个“。”的位置。)