如何在不锁定其他文本框的情况下保持对正在验证的文本框的关注?

时间:2011-09-27 11:58:07

标签: javascript forms validation

以下是我正在使用的验证方法的示例:

 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();焦点将保留在当前正在验证的文本框中,但所有其他文本框都将被锁定,直到输入正确的数据。

我想知道是否有办法将焦点保持在当前文本框而不锁定其他文本框(即用户仍然可以单击其他文本框)。由于我的验证同时适用于用户输入和表单提交,因此即使当前文本框中不包含正确的数据,用户也可以单击其他文本框。

有人可以帮忙吗?

谢谢,

尼克

1 个答案:

答案 0 :(得分:0)

您的要求似乎是矛盾的:您无法在一个输入中“保持焦点”,同时允许用户点击其他输入。

更常见的验证技术是onchangeonblur如果特定字段验证失败,则将其背景设置为不同的颜色,和/或在其旁边显示错误消息。然后,用户知道他们需要返回哪些字段,但他们仍然可以自由地首先进入其他字段。

话虽如此,如果您真的热衷于焦点想法,也许您只能在用户第一次尝试离开现场时设置焦点。如果他们试图再次允许它离开现场。

// 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值定义。即,如果以前从未验证过,或者上次验证它已通过。

(顺便说一下,你应该研究用正则表达式验证格式,而不是手动比较第一个“@”和最后一个“。”的位置。)