2

我是经典 ASP 和 javascript 的新手。一旦用户在文本框中输入日期,我正在尝试验证日期是否为 mm/dd/yyyy 格式。但是每次我在日期字段中输入两个数字时,它都会触发日期验证(validateExpFromDt)并说这是一个无效的日期。我知道这与触发 javascript 函数的 OnKeyUp 事件有关,但相同的事件适用于帐号的不同文本字段(validateAccNum(this))。如何仅在用户输入完整日期和不只是1个数字?这是asp片段

<td width="145" align="left" class="text">
    <input type="text" name="txtAccountNum1" value="<%=strPolNum1%>" size='5' align='RIGHT' maxlength="6" onFocus="select()" onKeyUp="return autoTab(this, 6, event), validateAcctNum(this);" tabindex="1" >
</td>

<td width="145" align="left" class="text">
    <input type="text" name="txtExpFromDt1" value="<%=strExpFromDt1%>" size='9' align='left' maxlength="10" onFocus="select()" onKeyUp="return autoTab(this, 10, event), validateExpFromDt(this);" tabindex="1" >
</td>

下面是被调用的 Javascript 函数:

function validateExpFromDt(inputExpFromDt) {

    var validformat=/^\d{2}\/\d{2}\/\d{4}$/; //Basic check for format validity
    var returnval=false

    if (!validformat.test(inputExpFromDt.value))
        alert("Invalid Date. Please ensure it is in mm/dd/yyyy format and submit again.");
    else{ //Detailed check for valid date ranges

        var monthfield=inputExpFromDt.value.split("/")[0]
        var dayfield=inputExpFromDt.value.split("/")[1]
        var yearfield=inputExpFromDt.value.split("/")[2]
        var dayobj = new Date(yearfield, monthfield-1, dayfield)

        if ((dayobj.getMonth()+1!=monthfield)||(dayobj.getDate()!=dayfield)||(dayobj.getFullYear()!=yearfield))
            alert("Invalid Date. Please ensure it is in mm/dd/yyyy format and submit again.")
        else
            returnval=true
    }

    if (returnval==false) 
        inputExpFromDt.select();

    return returnval;
}

非常感谢你的回复!

4

1 回答 1

1

问题是您正在针对正则表达式执行每次击键测试,该正则表达式永远不会将单个击键验证为有效日期。

在进行正则表达式匹配测试之前,您需要修改您的验证函数,以至少检查最小长度。如果目标字符串不是测试所需的最小长度,请跳过测试。

另一种选择是为不正确的日期实现不同类型的视觉提示,例如以不同颜色呈现无效日期的文本框内容(例如红色),但这样做会引入您可能需要解决的可访问性问题。

于 2013-11-06T20:33:16.780 回答