很抱歉这个问题很长,但是有一些背景你需要知道才能完全理解:
我正在Drupal 7中构建一个事件调度程序,它允许用户选中复选框以将事件添加到他们的日程安排中…这是一团乱。复选框包含一个类似于1404915600 - 1404917400
的值,它代表10:30am - 10:50am
,这是使用PHPs strtotime();
函数的结果,如strtotime("10:30am");
如果用户选择了另一个具有重叠时间的框作为先前选择的事件,并且如果存在重叠则触发错误,则需要检查。
目前,我正在使用上面提到的php函数来创建复选框中的值,然后在单击复选框时将这些值传递给javascript数组。复选框的id
是所选事件的url友好名称,它充当数组键,值是所选的时间,因此数组最终看起来像:
timeArr = { event-name-one: 0: 1404915600, 1: 1404917400 }
每个事件都有自己的键,以简化使用Javascripts delete
函数删除(或取消调度)事件。
下面是获取复选框ID和相关时间并将它们存储在数组中的完整代码:
var timeBox = jQuery('input[type="checkbox"].time, input[type="checkbox"].time2');
var timeArr = [];
// Listen for checkbox change
timeBox.bind('click', function() {
var eventID = jQuery(this).attr('id');
// If Checkbox IS checked
if(jQuery(this).prop('checked')) {
var timeStamp = jQuery(this).val();
var newTime = timeStamp.split(" - ");
// If timeArr has been set
if(timeArr.length > 1) {
for(key in timeArr) {
if(newTime[0] > timeArr[key][0] && newTime[0] < timeArr[key][1] || timeArr[key][0] > newTime[0] && timeArr[key][0] < newTime[1]) {
alert("Overlap!");
return false;
} else {
timeArr[eventID].push(newTime);
console.log(timeArr);
}
}
} else {
// else timeArr hasn't been set -- so set it!
timeArr[eventID] = newTime;
console.log(timeArr);
}
} else {
delete timeArr[eventID];
}
});
我似乎无法让新选择的事件时间与数组中的当前时间交叉检查。它们只是被附加到timeArr
数组中,就好像检查通过了一样。
我是完全错误的方式还是我只是遗漏了一些东西?我已经尝试了那么多不同的东西,我完全不知道哪一个方向是正确的。如果有帮助的话,我正在使用drupal7
公式为start1 < end2 && end1 > start2
。这将检测所需的所有4个比较中的重叠(如下所示)。您还需要确定确切的开始和结束时间是包含的还是排除的。也就是说,如果一个在1000点结束,另一个在1000点开始它们在这1000分钟内重叠吗?
重叠的四个条件是:
- Event1与Event2重叠(Event1: 10am-12am, Event2: 11am-1pm)
- Event1与Event2的结束重叠(Event1: 10am-12am, Event2: 9am-11am) Event1完全包含Event2 (Event1: 10am-12am, Event2: 1030am-1130am)
- Event2完全包含Event1 (Event1: 10am-12am, Event2: 9am-1pm)
上面的公式涵盖了所有4种可能的情况