我一直想弄清楚如何解决我遇到的这个问题。我需要找出一种方法来检查日历上选择的日期,看看它周围的任何东西是不可点击的。换句话说,如果在所选日期之后禁用日期,则它不能再进一步。
以下是一个例子:
说它的3月和3月共有31天。 用户选择第9天。 因此,第1-8天是不可选择的(我已经编写了这部分)
现在说第10天是不可选择的,因为它已经被某种东西占据了。在这种情况下,将不允许用户点击超过9日的任何其他日期,因为它不能越过已经被某些东西占用的那一天。
我真的不知道如何检查,但我确实已经在已禁用的数组类型中已经过了几天。那个数组看起来像这样:
[10,15,20]
与上面的情况一样,我知道哪些日子不可选,但如果用户(再次,根据上面的示例)选择第11天并且跨越第10天已经无法选择,我不知道如何编码
以下是它的照片: http://img704.imageshack.us/img704/9803/cals.jpg
任何帮助和想法都会很棒!
谢谢, 大卫
好的,使用ASP我已经解决了大部分问题:
sVal = tempResults 'This is the array of used dates already
tmpDate = tmpDate + 1 'This is the date they chose (9) and added a 1 making it 10 (next day)
theMonthDays = getDaysInMonth(theMonth, theYear) ' This just gets how many days are in the current selected month
ArrayOfValues = Split(sVal, ",") 'this splits the array of used dates to be checked below
For i = 0 To UBound(ArrayOfValues)
if tmpDate = CInt(ArrayOfValues(i)) then 'if it finds a date used already then block the rest
dim z, theBlockedDays
z = tmpDate
do until z = theMonthDays + 1
theBlockedDays = "'" & theMonth & "-" & z & "-" & theYear & "'," & theBlockedDays
z = z + 1
loop
exit for
end if
Next
现在适用于第9天但是如果我选择第11天则不起作用,因为第二天是打开的,然后是第二天打开。我该如何检查?
大卫
答案 0 :(得分:1)
让我看看我是否清楚地理解你的问题。
假设阻止日期为d0, d1, d2, ...dn
,按升序排列。
然后当用户选择一个不是阻止日期的日期k
时,您:
[1..k]
(你说你已经完成了这部分)[dj..31]
,其中j
最低,dj > k
。那么你如何找到dj
?嗯,一般来说,这是二元搜索的设计问题。您已对d0, d1, ...dn
进行了排序,因此二进制搜索会在dj
中找到O(log n)
。但是,由于我们讨论的是日历日期,因此只有31个可能的数字,因此线性搜索也不会有任何影响。
以下是一个简单的代码供您开始使用:
<script>
function search(v, a) {
for (var i = 0; i < a.length; i++) {
if (a[i] > v) {
return a[i];
}
}
return Infinity;
}
alert(search(5, [10, 15, 20])); // 10 --> block out [10..31]
alert(search(12, [10, 15, 20])); // 15 --> block out [15..31]
alert(search(17, [10, 15, 20])); // 20 --> block out [20..31]
alert(search(25, [10, 15, 20])); // Infinity --> blockout [Infinity..31], i.e. nothing
</script>