5

我正在尝试进行 javascript 表单验证,为此我需要调用两个函数。一个用于密码,一个用于用户名(我稍后还需要调用更多)。

这是我的 JS 代码:

function validateUserName(NewUser)
{
    var u = document.forms["NewUser"]["user"].value
    var uLength = u.length;
    var illegalChars = /\W/; // allow letters, numbers, and underscores
    if (u == null || u == "")
    {
        alert("You left Username field empty");
        return false;
    }
    else if (uLength <4 || uLength > 11)
    {
        alert("The Username must be between 4 and 11 characters");
        return fasle;
    }
    else if (illegalChars.test(u)) 
    {
        alert("The username contains illegal characters");
        return false;
    }
    else
    {
        return true;
    }
}

function validatePassword(pwd, confirmPwd)
{
    var p = document.forms["NewUser"]["pwd"].value
    var cP = document.forms["NewUser"]["cP"].value
    var pLength = p.length;
    if (p == null || p == "")
    {
        alert("You left the password field empty");
        return false;
    }
    else if (pLength < 6 || pLength > 20)
    {
        alert("Your password must be between 6 and 20 characters in length");
        return false;
    }
    else if (p != cP)
    {
        alert("Th passwords do not match!");
        return false;
    }
}

这是我的 HTML 表单:

<form name = "NewUser" onsubmit= "return validateUserName(), return validatePassword()" action = "">
                <tr>
                <td>Username:</td> 
                <td><input type = "text" name = "user"/></td> 
                </tr>
                <tr>
                <td class = "Information"><em>Must be 4-11 characters.<br/>Only numbers, letters and underscores.</em></td>
                </tr>

                <tr>
                <td>Password:</td>
                <td><input type = "password" name = "pwd"/></td>
                <tr>
                <td  class = "Information"><em>6-20 characters</em></td>
                </tr>

                <tr>
                <td>Confirm Password:</td>
                <td><input type = "password" name = "confirmPwd"/></td>
                <tr>
                <td  class = "Information"><em>just in case you didn't make mistakes!</em></td>
                </tr>

            <input type = "submit" value = "Submit"/>

请忽略表格代码。

我应该把它全部放在一个函数中吗?或者有没有办法一次调用两个函数?

4

6 回答 6

8

您有多种方法可以解决此问题,对于您当前的设置,最简单的方法是:

组合功能

无论每次返回什么状态,以下函数都将运行这两个函数,因为它们不会作为逻辑表达式的一部分内联执行,当获得错误值时会“短路”:

function validateForm(){
  var validation = true;
  validation &= validateUserName();
  validation &= validatePassword();
  return validation;
}

然后在您的表单标记中:

<form onsubmit="return validateForm()">

如果为了制作更多可重用代码,修改您的验证函数以便它们接受form参数可能是可取的。这意味着您可以执行以下操作:

<form onsubmit="return validateForm(this);">

..并让您的接收功能执行以下操作:

function validateForm(form){
  var validation = true;
  validation &= validateUserName(form);
  validation &= validatePassword(form);
  return validation;
}

添加多个事件

您还可以通过应用事件侦听器的首选方式来实现这一点,addEventListener而不是使用 html 属性onsubmit

/// wait for window load readiness
window.addEventListener('load', function(){
  /// you could improve the way you target your form, this is just a quick eg.
  var form;
  form = document.getElementsByTagName('form')[0];
  form.addEventListener('submit', validateUserName);
  form.addEventListener('submit', validatePassword);
});

以上假设需要支持现代浏览器。如果您希望支持旧版本的 Internet Explorer,您最好制作一个函数来应用您的事件处理,例如:

function addEventListener( elm, evname, callback ){
  if ( elm.addEventListener ) {
    elm.addEventListener(evname, callback);
  }
  else if ( elm.attachEvent ) {
    elm.attachEvent('on'+evname, callback);
  }
}

第二个选项使得对验证的内容、地点、时间和顺序进行全局控制变得更加困难,因此我推荐第一个选项。但是,我还建议至少submit使用上面的 JavaScript 方法应用您的单一处理程序,而不是使用onsubmit="".

于 2013-04-27T10:29:24.377 回答
5

只需将两者与逻辑 AND 运算符结合起来:

<form name="NewUser" onsubmit="return validateUserName() && validatePassword();" action="">
    <tr>
        <td>Username:</td> 
        <td><input type="text" name="user"/></td> 
    </tr>
    <tr>
        <td class="Information"><em>Must be 4-11 characters.<br/>Only numbers, letters and underscores.</em></td>
    </tr>
    <tr>
        <td>Password:</td>
        <td><input type="password" name="pwd"/></td>
    <tr>
        <td class="Information"><em>6-20 characters</em></td>
    </tr>
    <tr>
        <td>Confirm Password:</td>
        <td><input type="password" name="confirmPwd"/></td>
    </tr>
    <tr>
        <td class="Information"><em>just in case you didn't make mistakes!</em></td>
    </tr>
    <input type="submit" value="Submit"/>
</form>
于 2013-04-27T10:24:38.123 回答
2

有几种方法可以解决这个问题。一种是创建一个函数,例如 submitForm() ,然后调用您的其他两个函数。也许使用这些函数调用作为if语句的一部分来提供客户端验证。

另一种方法是覆盖表单的默认提交功能,而是调用您认为合适的函数。jQuery 为此提供了一种简单的方法。查看http://api.jquery.com/submit/了解更多信息。

理想情况下,validateUser()andvalidatePassword()函数将合并到 one functionvalidateUser()中。如果您遇到困难,您可能需要提供当前函数的代码以获取有关如何执行此操作的建议...

希望这可以帮助 :)

于 2013-04-27T10:30:41.417 回答
0

尝试这个

onsubmit="return fun2() && fun3();"
于 2015-02-28T05:06:13.283 回答
0

创建一个函数来调用所有验证器:

function validate() {
    return validateUserName() && validatePassword();
}

HTML

<form name="NewUser" onsubmit="return validate()" action="">

同样在您的密码验证功能中,您引用了不正确的字段名称。

固定代码:http: //jsfiddle.net/6sB29/

如果您想提醒所有错误(不仅是第一个错误),您可以尝试以下操作:

function validate() {
    var name = validateUserName(),
        pass = validatePassword();   
    return name && pass;
}

http://jsfiddle.net/6sB29/1/

于 2013-04-27T10:34:19.363 回答
0

为什么要创建两个不同的函数来验证用户名和密码,顺便说一下,你也可以像下面这样使用:

创建另一个第三个函数,这两个函数必须在其中调用并检查两者是否都返回 true,然后返回 true,否则它会显示消息或您想做的任何事情。

这是您可以执行此操作的代码:

function validateUserName(NewUser) {
        var u = document.forms["NewUser"]["user"].value
        var uLength = u.length;
        var illegalChars = /\W/; // allow letters, numbers, and underscores
        if (u == null || u == "") {
            alert("You left Username field empty");
            return false;
        }
        else if (uLength < 4 || uLength > 11) {
            alert("The Username must be between 4 and 11 characters");
            return fasle;
        }
        else if (illegalChars.test(u)) {
            alert("The username contains illegal characters");
            return false;
        }
        else {
            return true;
        }
    }

    function validatePassword(pwd, confirmPwd) {
        var p = document.forms["NewUser"]["pwd"].value
        var cP = document.forms["NewUser"]["cP"].value
        var pLength = p.length;
        if (p == null || p == "") {
            alert("You left the password field empty");
            return false;
        }
        else if (pLength < 6 || pLength > 20) {
            alert("Your password must be between 6 and 20 characters in length");
            return false;
        }
        else if (p != cP) {
            alert("Th passwords do not match!");
            return false;
        }
    }



    function finalvalidate() {
        var newuser = $('[id$=newuser]').val();
        var usernameresult = validateUserName(newuser);
        var pwd = $('[id$=pwd]').val();
        var confirmPwd = $('[id$=confirmPwd]').val();
        var pwdresult = validatePassword(pwd, confirmPwd);
        if (usernameresult == true && pwdresult == true) {
            return true;
        } else {
            return false;
        }
    }

希望这对你有用..

于 2013-04-27T10:34:33.933 回答