我正在使用<cfinput type="datefield">
,我需要限制可以选择的日期。我不能允许过去可以选择的日期。这里有什么帮助吗?
谢谢!
答案 0 :(得分: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
另一篇帖子建议使用范围功能,但我无法使其工作,因为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 上使用 cincput 的 onChange 属性,但是有一个错误,它不会调用javascript函数这似乎是在网上的其他几个页面上记录的。我使用的解决方法是使用bind属性调用cfajaxproxy。如果你正在使用cfeclipse,它会给你一个错误,语法不正确,但它对我来说很好。
隐藏输入类型是必要的,因为使用cfajaxproxy标记,每次单击日历图标时,它将调用javascript函数,这不是我们想要的。所以我存储了用户选择的最后一个值(或者在页面加载时为-1),这样只有在值发生变化时才会执行检查它是否在范围内的javascript。这有点像黑客攻击,但是<cfinput type="datefield">
的实现并没有按照文档记录的那样工作。
您也可以修改此示例,以便coldfusion动态生成开始日期和结束日期,以便它不会被硬编码。
请记住,无论您选择哪种方式,都应该检查值服务器端,以防用户禁用javascript。
答案 1 :(得分:1)
试试这个:
三个日期字段。
一个被hieght = 0隐藏。这是你的出发点。我今天使用加一,所以用户今天可以在Date Requested字段中选择。
<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" >
答案 2 :(得分:0)
AFAIK,没有简单的方法可以防止客户过去挑选一天。我们在一些表单上有这样的字段,我们检查服务器端的当前日期。只记得在没有时间进行比较的情况下生成日期,或者最终得到[今天的日期]&lt;现在()。
答案 3 :(得分:0)
首先,我认为<cfcalendar>
会有所帮助,但似乎startrage
和endrange
适用于禁用范围。
我想如果您真的想限制范围,请使用其他内容,例如jQuery UI Datepicker
答案 4 :(得分:0)
通过实验,我能够将支持的javascript文件自定义为restrict the selectable dates。然而,jQuery选项听起来也不错。
答案 5 :(得分: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#">
西蒙。
答案 6 :(得分: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" >
答案 7 :(得分:-1)
您也应该使用服务器端验证,但我相信您可以使用cfinput的“range”属性来限制有效日期。