65.9K
CodeProject 正在变化。 阅读更多。
Home

常见验证场景的微型 JavaScript 框架

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (14投票s)

2012年6月20日

CPOL

5分钟阅读

viewsIcon

51736

downloadIcon

950

本文介绍了一些可重复使用的 JavaScript 函数,这些函数可用于创建接受特定类型数据的输入字段。它还提供了用于验证数据的函数。

 

介绍 

本文介绍了一些可重复使用的JavaScript函数,这些函数可用于创建接受特定类型数据的输入字段。它还提供了用于根据输入字段是否必填以及/或是否需要与正则表达式进行匹配来验证数据的函数。

背景 

在许多场景下,我们希望限制用户输入某些特定类型的数据。例如,我有一个文本框用于接收用户姓名,那么该文本框不应该接受数字字符。同样,如果我有一个应该只接受数字输入的文本框,为什么允许用户输入字母呢?在许多场景下,我们可能只希望接受某些特定字符。上述所有场景并非严格意义上的验证,但拥有这类输入字段无疑会使其他客户端验证任务变得容易。

第二个方面是在提交前验证输入字段。jQuery validation 提供了一种非常简洁的处理此类验证的方法,但有时这似乎有些“杀鸡用牛刀”。如果有一个简单的机制来检查必填字段并与正则表达式进行验证,则可以处理很多验证。

我这里展示的是一个我使用已久的微型 JavaScript 文件。该文件包含一些函数,可以轻松地实现上述所有验证功能。对大多数人来说,这可能显得有点基础,但这个小框架可能会非常有用。

重要提示:客户端验证是确保数据有效性的第一道检查。它对大多数普通用户都会有效。具有恶意意图的更高级用户仍然可以绕过 JavaScript 代码。因此,在服务器端也保留相同的验证集以确保无效数据无法通过,始终是个好主意。

Using the Code

在查看代码之前,让我们先看一下我们将要处理的各种场景。

  1. 能够创建一个仅接受字母的输入字段。我们应该能够指定是否允许空格。
  2. 能够创建一个仅接受数字的输入字段。我们应该能够指定是否允许小数点。
  3. 能够创建一个接受字母和数字的输入字段。我们应该能够指定是否允许空格和小数点。
  4. 能够创建一个接受日期特定字符的输入字段。我们应该能够指定我们将使用的分隔符。
  5. 能够创建一个接受正则表达式中存在的字符的输入字段。
  6. 在回发前验证一个必填输入字段。
  7. 在回发前将输入字段与正则表达式进行验证。

让我们逐一详细看看。我将首先提供 JavaScript 函数,然后说明如何使用该函数。如果某个函数需要特别注意,我也会提及。

接受正则表达式中存在的字符

//Function to create textbox based on regular expressions
function AcceptRegExOnly(event, regex)  
{   
    var keyCode = event.which ? event.which : event.keyCode;
    
    var keyPressed = String.fromCharCode(keyCode);
    return regex.test(keyPressed);
}; 

如何在 aspx 标记中使用此函数

<asp:TextBox ID="TextBox7" runat="server" onkeypress="return AcceptRegExOnly(event, /^[a-zA-Z@]$/);">
</asp:TextBox>

仅接受字母

有两个函数可以实现此目的。第一个函数使用keycode 来实现。第二个函数使用正则表达式来实现。这两个函数都会完成相同的任务,但如果由于某种原因,keycode 没有给出正确的结果,可以使用基于正则表达式的实现。请注意,两个实现都接受一个Boolean 参数来指定是否允许空格。

//Function to create alphabetic text box only - using keycodes
function AcceptAlphabetsOnly(event, allowSpaces) 
{
    var keyCode = event.which ? event.which : event.keyCode;
    
    if (    (keyCode >= 97 && keyCode <= 122) ||        //lets allow for the small alphabets
            (keyCode >= 65 && keyCode <= 90)  ||        //Let us allow the capital letters too
            ((allowSpaces == true) && (keyCode == 32))  //allow space conditionally 
                                                        //based on the control's choice
       )
    {
        return true;
    }
    
    return false;
};

//Function to create alphabetic text box only - using regex
function AcceptAlphabetsOnlyEx(event, allowSpaces) 
{
    if(allowSpaces == true)
    {
        return AcceptRegExOnly(event, /^[a-zA-Z ]$/);
    }
    return AcceptRegExOnly(event, /^[a-zA-Z]$/);
};

现在,让我们看看它们如何从 aspx 标记中使用。

<asp:TextBox ID="TextBox1" runat="server" onkeypress="return AcceptAlphabetsOnly(event, false);">
</asp:TextBox>

<asp:TextBox ID="TextBox2" runat="server" onkeypress="return AcceptAlphabetsOnlyEx(event, false);">
</asp:TextBox>

仅接受数字

有两个函数可以实现此目的。第一个函数使用keycode 来实现。第二个函数使用正则表达式来实现。这两个函数都会完成相同的任务,但如果由于某种原因,keycode 没有给出正确的结果,可以使用基于正则表达式的实现。请注意,两个实现都接受一个Boolean 参数来指定是否允许小数点。

//Function to create numeric text box only - using keycodes
function AcceptNumericOnly(event, allowPeriod) 
{
    var keyCode = event.which ? event.which : event.keyCode;    
    
    if( (keyCode >= 48 && keyCode <= 57) ||         //lets allow only numerics 
        ((allowPeriod == true) && (keyCode == 46))  //allow period conditionally 
                                                    //based on the control's choice
      )
    {
        return true;
    }   
    
    return false;
};

//Function to create numeric text box only - using regex
function AcceptNumericOnlyEx(event, allowPeriod) 
{  
    if(allowPeriod == true)
    {
        return AcceptRegExOnly(event, /^[0-9.]$/);
    }
    return AcceptRegExOnly(event, /^[0-9]$/);
};

现在,让我们看看它们如何从 aspx 标记中使用。

<asp:TextBox ID="TextBox3" runat="server" onkeypress="return AcceptNumericOnly(event, false);">
</asp:TextBox>

<asp:TextBox ID="TextBox4" runat="server" onkeypress="return AcceptNumericOnlyEx(event, false);">
</asp:TextBox>

仅接受字母和数字

有两个函数可以实现此目的。第一个函数使用keycode 来实现。第二个函数使用正则表达式来实现。这两个函数都会完成相同的任务,但如果由于某种原因,keycode 没有给出正确的结果,可以使用基于正则表达式的实现。请注意,两个实现都接受两个Boolean 参数。第一个用于指定是否允许空格,第二个用于指定是否允许小数点。

//Function to create alphanumeric text box - using keycodes
function AcceptAlphaNumericOnly(event, allowSpaces, allowPeriod)  
{
    if( (AcceptAlphabetsOnly(event, allowSpaces) == true) ||    //Create alphabetic text box
        (AcceptNumericOnly(event, allowPeriod) == true)         //Create numeric text box
      )
    {
        return true;
    }
    
    return false;
};

//Function to create alphanumeric text box - using regex
function AcceptAlphaNumericOnlyEx(event, allowSpaces, allowPeriod) 
{
    if(allowSpaces == true && allowPeriod == false)
    {
        return AcceptRegExOnly(event, /^[a-zA-Z0-9 ]$/);
    }
    if(allowPeriod == true && allowSpaces == false)
    {
        return AcceptRegExOnly(event, /^[a-zA-Z0-9.]$/);
    }
    if(allowPeriod == true && allowSpaces == true)
    {
       return AcceptRegExOnly(event, /^[a-zA-Z0-9 .]$/);
    }
    
    return AcceptRegExOnly(event, /^[a-zA-Z0-9]$/);
};

现在,让我们看看它们如何从aspx 标记中使用。

<asp:TextBox ID="TextBox5" runat="server" 
 onkeypress="return AcceptAlphaNumericOnly(event, false, false);">
</asp:TextBox>

<asp:TextBox ID="TextBox6" runat="server" 
 onkeypress="return AcceptAlphaNumericOnlyEx(event, false, false);">
</asp:TextBox>

仅接受日期特定字符

//This function will create the date text box
function AcceptDateCharacters(event, separator)
{
    if(separator.length != 1)  //only pass single character separators here
    {
        return false;
    }
    //lets allow digits
    var expression = "^[0-9";
    
    //lets allow the separator character
    expression += separator;
    
    //lets complete the expression
    expression += "]$";
    
    var regex = new RegExp(expression);    
    return AcceptRegExOnly(event, regex)  
};

现在,让我们看看如何使用此函数来接受以“-”作为分隔符的日期字符串。

<asp:TextBox ID="TextBox8" runat="server" onkeypress='return AcceptDateCharacters(event, "-");'>
</asp:TextBox>

设置表单提交前的验证

现在,在继续之前,我们将查看提交按钮的标记代码,因为现在我们将处理客户端验证,然后在提交到服务器。

<asp:Button ID="Button1" runat="server" Text="Submit" OnClientClick="return validateForm();" />

检查输入字段是否为必填字段

现在让我们看看将在提交前调用的函数,以确保必填字段的值是否已存在。

//This function will check for the mandatory field
function CheckMandatoryInput(input)
{   
    if(input.value.length == 0)
    {   
        input.style.borderColor="Red";
        input.title = "This field is mandatory";
        return false;
    }
    
    input.style.borderColor="";
    input.title = "";
    return true;
};

以及如何从客户端标记页面使用它。

function validateForm()
{
    if(CheckMandatoryInput(document.getElementById("TextBox1")) == false)
    { 
        return false;
    }            
}

将输入字段与正则表达式进行匹配

现在让我们看看将在提交前调用的函数,以确保输入字段中的值是否符合所需的正则表达式。

//This function will check for the input using regular expression
function CheckWithRegExp(input, regex, mandatory)
{
    if(mandatory == true && CheckMandatoryInput(input) == false)
    {
        return false;
    }
    if(regex.test(input.value) == false)  
    {
        input.style.borderColor="Red";
        input.title = "This is not a valid input";
        return false;
    }    
    
    input.style.borderColor="";
    input.title = "";
    return true;
};

以及如何从客户端标记页面使用它。

function validateForm()
{ 
    if(CheckWithRegExp(document.getElementById("TextBox1"), /^[a-z]{3,10}$/, true) == false)
    {                
        return false;
    }
}

现在,我们已成功配置了输入字段以接受所需输入,并提供了非常基本的客户端验证,然后在提交表单。

关注点

这个 JavaScript 是我为客户端验证创建的。发布这篇文章的主要想法是由于在 **Codeproject** 的“快速提问”部分提出的问题。似乎有许多初学者在尝试实现此类功能时遇到困难,或许这个可重用代码可以帮助到他们。

历史

  • 2012年6月20日 - 初始版本
用于常见验证场景的微型 JavaScript 框架 - CodeProject - 代码之家
© . All rights reserved.