Javascript 检查时间范围是否重叠,如果为真,则触发错误

Javascript 检查时间范围是否重叠,如果为真,则触发错误,javascript,php,jquery,arrays,checkbox,Javascript,Php,Jquery,Arrays,Checkbox,很抱歉,这个问题太长,但您需要了解一些背景知识才能完全理解: 我正在Drupal7中构建一个事件调度器,它允许用户选中复选框,将事件添加到他们的计划中。。。而且是一团糟。复选框包含一个类似于1404915600-1404917400的值,表示10:30am-10:50am,这是使用PHPsstrotime()的结果功能类似于sostrotime(“上午10:30”) 我需要即时检查用户是否选中另一个框,将重叠时间作为以前选择的事件,如果存在重叠,则触发错误 目前,我正在使用上面提到的php函数在

很抱歉,这个问题太长,但您需要了解一些背景知识才能完全理解:

我正在Drupal7中构建一个事件调度器,它允许用户选中复选框,将事件添加到他们的计划中。。。而且是一团糟。复选框包含一个类似于
1404915600-1404917400
的值,表示
10:30am-10:50am
,这是使用PHPs
strotime()的结果功能类似于so
strotime(“上午10:30”)

我需要即时检查用户是否选中另一个框,将重叠时间作为以前选择的事件,如果存在重叠,则触发错误

目前,我正在使用上面提到的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];
    }        
});
var timeBox=jQuery('input[type=“checkbox”].time,input[type=“checkbox”].time2');
var timeArr=[];
//侦听复选框更改
timeBox.bind('click',function(){
var eventID=jQuery(this.attr('id');
//如果选中复选框
if(jQuery(this).prop('checked')){
var timeStamp=jQuery(this.val();
var newTime=timeStamp.split(“-”);
//如果已设置timeArr
如果(timeArr.length>1){
用于(输入时间arr){
如果(newTime[0]>timeArr[key][0]&newTime[0]newTime[0]&timeArr[key][0]
我似乎无法使新选择的事件时间与数组中的当前时间进行交叉检查。它们只是附加到
timeArr
数组中,就好像检查通过了一样


我是完全走错了路,还是我只是错过了一些小东西?我尝试过很多不同的事情,但我完全不知道该朝哪个方向走。如果有帮助的话,我正在使用Drupal 7。

公式是
start1start2
。这将检测所需的所有4个比较中的重叠(见下文)。您还需要确定确切的开始和结束时间是包含时间还是独占时间。也就是说,如果某个东西在1000点结束,而另一个东西在1000点开始,它们是否重叠了整整1000分钟

重叠的四个条件是:

  • 事件1与事件2的开始重叠(事件1:10am-12am,事件2:11am-1pm)
  • 事件1与事件2的结尾重叠(事件1:10am-12am,事件2:9am-11am)
  • 事件1完全包含事件2(事件1:10am-12am,事件2:1030am-1130am)
  • 事件2完全包含事件1(事件1:10am-12am,事件2:9am-1pm)

  • 上面的公式涵盖了所有4种可能的情况。

    请记住,来自表单字段的任何内容都将是字符串,来自
    .split()
    的任何内容都将是字符串
    '9'>'44'
    在JS中为TRUE,而
    9>44
    为FALSE。所以我需要使用
    parseInt()
    返回一个整数?编辑:实际上,我需要循环遍历数组并使用
    parseInt()是的。由于您所做的操作仅在数字上下文中有意义,因此必须将这些字符串转换为数字。当然,您的大多数时间戳都非常接近,所以现在不太可能出现问题。但在某个时候,你会被这个问题所困扰,并且不知道为什么
    '9'
    会失败。是的,你需要parseInt来获得一个整数值。为了检测JS中的重叠,最好创建一个JS日期对象并与之进行比较。公式是
    start1start2
    。这将检测所需的所有4个比较中的重叠。您还需要确定确切的开始和结束时间是包含时间还是独占时间。也就是说,如果某个时间在1000点结束,而另一个时间在1000点开始,那么它们是否重叠了整整1000分钟?@JonathanKuhn你能举个例子说明我如何使用JS Date对象转换这些时间吗?编辑:如果一个在1000处结束,而另一个在1000处开始,则不视为重叠。