0

我正在使用<cfinput type="datefield">并且我需要限制可以选择的日期。我不能允许可以选择过去的日期。这里有什么帮助吗?

谢谢!

4

8 回答 8

2

好吧,您有两个选项可以严格验证服务器端或另外添加客户端 javascript 检查。

对于服务器端,您的 cfm 处理页面可以使用DateCompare函数,如下所示:

<cfif DateCompare(Date1,Date2) EQUAL -1>
<!--- Date 1 < Date 2 ---> 
<cfelseif DateCompare(Date1,Date2) EQUAL 0>
<!--- Date 1 = Date 2 ---> 
<cfelseif DateCompare(Date1,Date2) EQUAL 1>
<!--- Date 1 > Date 2 --->
</cfif>

此函数的文档和示例代码位于: http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_m -r_11.html

另一篇文章建议使用范围功能,但是我无法让它工作,因为 Adob​​e 文档说它只支持numeric类型。

或者,您可以使用 javascript 检查日期是否在页面上的实时范围内:

<html>
<head>
<script type="text/javascript">
function withinRange(submittedDate) {
    var start = Date.parse("08/10/2009");
    var end = Date.parse("09/11/2009");
    var userDate = Date.parse(document.getElementById('leaveDate').value);
    var previousDate = document.getElementById('calendarWorkaround').value;

    if (!isNaN(userDate) && ( previousDate != userDate)) {
        document.getElementById('calendarWorkaround').value = userDate;
        if (start <= userDate && end >= userDate) {
            alert("Your date is correct!");
        } else {
            alert("Date is incorrect.");
        }
    }
}
</script>
</head>
<body>
<cfform name="testing" id="vacationForm"action="testprocess">
    <cfinput name="date" type="datefield" id="leaveDate">
    <input type="hidden" name="workaround" id="calendarWorkaround" value="-1">
</cfform>

<!--- To get around onChange bug with cfinput type datefield --->
<cfajaxproxy bind="javaScript:withinRange({leaveDate})">

</body>
</html>

现在我会在datefield上使用cfinput的onChange属性,但是有一个错误,它没有调用似乎记录在其他几个在线页面上的 javascript 函数。我使用的解决方法是使用 bind 属性调用 cfajaxproxy。如果您使用的是 cfeclipse,它会给您一个语法不正确的错误,但它对我来说很好。

隐藏输入类型是必要的,因为使用 cfajaxproxy 标记,每次单击日历图标时都会调用 javascript 函数,这不是我们想要的。所以我存储用户选择的最后一个值(或页面加载时的-1),以便检查它是否在范围内的javascript仅在值更改时执行。这有点像 hack,但是 的实现<cfinput type="datefield">并不像记录的那样工作。

您还可以修改此示例,以便coldfusion dynamical 生成开始日期和结束日期,这样就不会对其进行硬编码。

请记住,无论您选择哪种方式,都应始终检查值服务器端,以防万一用户禁用了 javascript。

于 2009-08-05T16:23:52.980 回答
1

尝试这个:

三个日期字段。

一个被 hieght = 0 隐藏。这是你的起点。我使用了今天加一,因此用户可以在“请求日期”字段中选择今天。

<cfformgroup type="horizontal"  height="0">
<cfinput type="datefield" name="firstAvailableDate" value="#dateAdd('d', +1,now())#" 
</cfformgroup>

请求的日期将仅是今天或之前。

<cfformgroup type="horizontal">
<cfinput type="datefield" name="request_date" id="request_date"  mask="mm/dd/yyyy"  width="100" label=”Date Requested”  onFocus="request_date.disabledRanges=[{rangeStart:firstAvailableDate.selectedDate}];" />

截止日期只能在所选择的请求日期之后。

<cfinput type="datefield" name="datedue"  id="datedue"  mask="mm/dd/yyyy"   width="100" label=”Due Date” onFocus="datedue.disabledRanges=[{rangeEnd:request_date.selectedDate}];" />
</cfformgroup type="horizontal" >
于 2011-06-24T19:24:25.390 回答
0

通过实验,我能够自定义支持的 javascript 文件以限制可选日期。然而,jQuery 选项听起来也不错。

于 2009-08-07T12:31:05.310 回答
0

我刚刚为 cfcalendar 组件的 endrange 属性添加了 100 年,我认为没有人会坐下来点击那么远来击败您的验证:

<cfset startRange = #dateformat(now(), 'dd/mm/yyyy')# >
<cfset endRange = dateadd("yyyy", 100, #Now()#)>
<cfset selectedDate = dateadd("d", -1, #Now()#)>

<cfcalendar name="start_period" mask="dd/mm/yyyy" selecteddate="#selectedDate#" startRange="#startRange#" endrange="#endRange#">

西蒙。

于 2010-03-22T16:47:24.600 回答
0

您不能使日期字段限制可以选择的日期。CFINPUT没有任何属性来定义这种类型的规则。你必须去 Jquery datepicker。如果你想使用 cfinput,你可以解决这个问题。

<script language="JavaScript">
 $(function() {
    $( "#date" ).datepicker({
      changeMonth: true,
      changeYear: true,
       minDate: new Date(1939, 10 - 1, 25),
       maxDate: '-1D'
    });
  });
</script>
<cfinput name="date" type="text" size="30"  id="date" >
于 2014-08-25T10:29:38.220 回答
0

起初,我认为<cfcalendar>会有所帮助,但似乎startrageandendrange用于禁用范围。

我想如果您真的想限制范围,请使用jQuery UI Datepicker之类的其他东西

于 2009-08-05T18:26:13.467 回答
0

AFAIK,没有简单的方法可以防止客户选择过去的一天。不过,我们在一些表单上有类似的字段,我们会在服务器端检查当前日期。只需记住生成日期而没有时间进行比较,否则您最终会得到 [今天的日期] < now()。

于 2009-08-05T15:04:53.390 回答
-1

您也应该使用服务器端验证,但我相信您可以使用 cfinput 的“范围”属性来限制有效日期。

于 2009-08-05T15:22:52.147 回答