【问题标题】:Javascript form validation, too many if statements?Javascript 表单验证,if 语句太多?
【发布时间】:2013-01-13 00:16:18
【问题描述】:

我有一个包含五个元素的表单,firstNamelastNameusernamepasswordpasswordConfirmation

var errors = [];
var errorsText = [];


function generateError(messageText, elementIdentifier) {
var messageText = messageText;
var elementIdentifier = elementIdentifier;
errors.push(elementIdentifier);
errorsText.push(messageText);
return false;
}



function validateRegistrationForm(firstName, lastName, username, password, passwordConfirmation) {
formReset();
//alert("validateRegistrationForm() has been called");

var firstName = firstName;
//alert("First Name = \'" + firstName + "\'");
var lastName = lastName;
//alert("Last Name = \'" + lastName + "\'");
var username = username;
//alert("Username = \'" + username + "\'");
var password = password;
//alert("Password = \'" + password + "\'");
var passwordConfirmation = passwordConfirmation;
//alert("Password Confirmation = \'" + passwordConfirmation + "\'");

if ( ( firstName == null ) || ( firstName == "" ) ) {
    //alert("//firstname hasn't been filled out");

    generateError("You must provide a First Name", "firstName");
} 

if ( ( lastName == null ) || ( lastName == "" ) ) {
    //lastname hasn't been filled out
    generateError("You must provide a Last Name", "lastName");
}

if ( ( username == null ) || ( username == "" ) ) {
    //username hasn't been filled out
    generateError("You must enter a Username", "username");
}

if ( ( password == null ) || ( password == "" ) ) {
    //password hasn't been filled out
    generateError("You haven\'t entered a password", "password");
}

if ( ( passwordConfirmation == null ) || ( passwordConfirmation == "" ) ) {
    //passwordconfirmation hasn't been filled out
    generateError("You haven\'t confirmed your password", "passwordConfirmation");
}

validatePassword(password, passwordConfirmation);

}

有没有更好的方法来处理所有if statements

【问题讨论】:

  • 虽然可能稍微超出了这个问题的范围,但许多 JS 框架提供了在“模型”上定义验证方法/消息的选项以及显示对验证的响应的标准方式
  • 感谢@dougajmcdonald,但对于这个项目,我没有使用任何库,如 jQuery 等

标签: javascript html forms validation


【解决方案1】:

考虑创建字段名称和错误消息的映射:

var errorMessages = {
  firstName:"You must provide a First Name",
  lastName: "You must provide a Last Name",
  username: "You must enter a Username",
  password: "You haven't entered a password",
  passwordConfirmation: "You haven\'t confirmed your password"
};

也许还有一个用于有条件地抛出错误的小辅助函数:

var assertIsFilled = function(name, value) {
  if(!value) {
    generateError(errorMessages[name], name);
  }
});

这将很好地清理您的验证功能:

function validateRegistrationForm(firstName, lastName, username, password, passwordConfirmation) {
  formReset();
  assertIsFilled("firstName", firstName);
  assertIsFilled("lastName", lastName);
  assertIsFilled("username", username);
  assertIsFilled("password", password);
  assertIsFilled("passwordConfirmation", passwordConfirmation);

  validatePassword(password, passwordConfirmation);
}

【讨论】:

  • 您因使用对象存储字符串而获得了我的 +1;总是很好,因为这意味着您可以轻松地交换语言。
【解决方案2】:

这看起来你可以使用Logical OR 短路

function validateRegistrationForm(firstName, lastName, username, password, passwordConfirmation) {
    formReset();
    firstName || generateError("You must provide a First Name", "firstName");
    lastName || generateError("You must provide a Last Name", "lastName");
    username || generateError("You must enter a Username", "username");
    password || generateError("You haven\'t entered a password", "password");
    passwordConfirmation || generateError("You haven\'t confirmed your password", "passwordConfirmation");
    validatePassword(password, passwordConfirmation);
}

【讨论】:

  • 您能否编辑它以向我展示如果已填写密码和密码确认,我将如何仅调用 validatePassword。
  • 我整理出来了,感谢您的意见。它有效,正是我暂时需要的。
  • @Mike sorry 被取消了。这可以由password && passwordConfirmation && validatePassword(password, passwordConfirmation) 完成。
【解决方案3】:

您无需同时检查nullempty string,只需检查该值是否为真。

if (firstName) { 
 // value is truthy 
}

或者更确切地说,您可以使用以下内容,

if (!firstName) {
 // value is non-truthy
 generateError("You must provide a First Name", "firstName");
}

【讨论】:

    【解决方案4】:

    你能做这样的事情吗? :

    jQuery(":input").bind("blur change",function(){
         if(jQuery(this).val()===null || jQuery(this).val()===""){
         generateError();
        }
    })
    

    您还可以通过这种方式过滤掉不需要验证的输入。

    原始 JS 版本:

    var inputs = document.getElementsByTagName('input');
    
    for (var i=0, len=inputs.length; i<len; i++){
        if (inputs[i].type == 'text'){      
            inputs[i].onclick = function(){ 
                  if(this.value===null || this.value===""){
                    generateError();
                  }       
    
            }
    //same for onBlur
        }
    }
    

    【讨论】:

    • 我没有使用 jQuery,我知道这是我可以研究的东西,但对于这个项目我没有使用它。
    • 你应该能够对原始 JS 做同样的事情,但它会更冗长一些。我已经用应该可以工作的原始 JS 版本稍微更新了帖子
    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多