我正在使用<cfinput type="datefield">
并且我需要限制可以选择的日期。我不能允许可以选择过去的日期。这里有什么帮助吗?
谢谢!
我正在使用<cfinput type="datefield">
并且我需要限制可以选择的日期。我不能允许可以选择过去的日期。这里有什么帮助吗?
谢谢!
好吧,您有两个选项可以严格验证服务器端或另外添加客户端 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
另一篇文章建议使用范围功能,但是我无法让它工作,因为 Adobe 文档说它只支持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。
尝试这个:
三个日期字段。
一个被 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" >
通过实验,我能够自定义支持的 javascript 文件以限制可选日期。然而,jQuery 选项听起来也不错。
我刚刚为 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#">
西蒙。
您不能使日期字段限制可以选择的日期。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" >
起初,我认为<cfcalendar>
会有所帮助,但似乎startrage
andendrange
用于禁用范围。
AFAIK,没有简单的方法可以防止客户选择过去的一天。不过,我们在一些表单上有类似的字段,我们会在服务器端检查当前日期。只需记住生成日期而没有时间进行比较,否则您最终会得到 [今天的日期] < now()。
您也应该使用服务器端验证,但我相信您可以使用 cfinput 的“范围”属性来限制有效日期。