检测 dayclick 事件的营业时间

Posted

技术标签:

【中文标题】检测 dayclick 事件的营业时间【英文标题】:Detect business hours on dayclick event 【发布时间】:2017-07-06 11:36:20 【问题描述】:

如何检测 dayclick 事件是在营业时间内触发还是在营业时间内触发? 仅当点击事件发生在营业时间时,我才需要执行一些操作。

现在,我可以设置营业时间并使用 css 设置它们以显示为红色背景和不同的光标,但我不知道如何在 dayclick 事件中检测到这一点:(

我的代码是:

$('#calendar').fullCalendar(
    theme: true,
    defaultView: 'agendaWeek',
    allDaySlot: false,
    header: 
        left: 'prev,next today',
        center: 'title',
        right: 'agendaWeek,agendaDay,listMonth'
    ,
    contentHeight: 'auto',
    defaultDate: '2017-02-17',
    navLinks: true,
    editable: false,
    eventLimit: true,
    minTime: "09:00:00",
    maxTime: "19:00:00",
    slotMinutes: 30,
    slotDuration: "00:30:00",
    slotLabelInterval: 30,
    slotLabelFormat: 'h(:mm)a',
    defaultTimedEventDuration: "00:29:00",
    forceEventDuration: true,
    businessHours: 
        dow: [1,2,3,4,5,6], // NOT SUNDAY
        start: '09:00:00',
        end: '19:00:00'
    ,
    dayClick: function(fechaElegida, todoElDia, jsEvento, vista) 
        // HERE DO THINGS
        // I want some like
        // if( IS BUSINESS HOURS )
        //    DO SOMETHING
        // else
        //    DO OTHER THINGS
        // 
    ,
    eventClick: function(calEvento, jsEvento, vista) 
        // MORE CODE. NOT RELEVANT
    ,
    viewRender: function(view,element)  //restricting available dates to 2 moths in future
        var now = new Date();
        var end = new Date();
        end.setMonth(now.getMonth() + 1); //Adjust as needed
        if ( end < view.end) 
            $("#calendar .fc-next-button").hide();
            return false;
        else 
            $("#calendar .fc-next-button").show();
        
        if ( view.start < now) 
            $("#calendar .fc-prev-button").hide();
            return false;
        else 
            $("#calendar .fc-prev-button").show();
        
    ,
    events: [
        
            title: 'Test event',
            start: '2017-02-17 09:00:00',
            id: '14',
            skey: 'rra7r15pm8',
            color: '#10A834'
        
    ]
);

谢谢。

【问题讨论】:

我们可以看看一些示例代码吗? 好的。帖子已编辑以添加我的代码。谢谢。 那么您的日程安排是周一到周六朝九晚九吗? 周一至周六,9:00 至 19:00,我用红色背景和“不允许”光标显示周日,但只是化妆。如果我点击星期天,仍然会激活 dayclick 事件。 我已经在下面添加了我的答案,请看一下 【参考方案1】:

您的 dayclick 事件应该接收当前日期作为函数调用的一部分,因此您需要做的就是根据您的营业时间检查该日期,以查看所选时间是否在营业时间内。下面你会看到一个小函数,它传递了一个日期对象,如果传递的日期是在工作时间,则返回一个,如果不是,则返回零。该函数的工作方式是它首先检查星期几以确保所选日期不是星期天,然后它将检查所选时间并查看它是否在 9 到 18 之间,我使用 18 而不是 19在我的函数中,因为使用 18 作为小时参数意味着您将包含最多 18:59:59 的时间,这恰好是您关闭前一秒。

function checkIfBusinessHours(date) 
  if (date.getDay() == 0) 
    return 0;
   else 
    if (date.getHours() <= 18 && date.getHours() >= 9) 
      return 1;
     else 
      return 0;
    
  

以及如何使用此功能的示例如下:

dayClick: function(fechaElegida, todoElDia, jsEvento, vista) 
    // HERE DO THINGS
    // I want some like
   if(checkIfBusinessHours(fechaElegia)==1)
    //    DO SOMETHING
   else
    //    DO OTHER THINGS
   

可以找到代码的现场演示:HERE

【讨论】:

好的。我会在一段时间内测试它。那么,在 fullcalendar 函数“内部”不是一个解决方案吗?有没有办法从fullcalendar中的某个对象获取“营业时间”并用它来比较,而不是直接在函数中写“18”或“9”或“0”天?谢谢 如果您只是简单地从函数中复制代码并将其放入 dayclick,它将执行相同的操作,我将考虑重写代码以从 fullcalandar 中的变量中获取营业时间 您的原始功能在我的情况下不起作用。我必须做一些改变。首先,我必须将“fechaElegida”转换为日期对象,然后使用 getDay 函数。但主要思想有效。谢谢。 @lesterfibla 没问题,如果您能将此答案标记为正确,将不胜感激【参考方案2】:

最后,答案是使用“not in fullcalendar”函数将所选日期与与数组 businessHours: dow:[1,2,3,4,5,6] 相同的数组进行比较

在调用 fullCalendar 之前,我创建了一个包含可用天数的数组(与下班营业时间相同)

var DaysOK = [1,2,3,4,5,6];

然后,在 dayClick 事件中:

dayClick: function(mydate, allDay, jsEvent, view) 
  var mydateObj = new Date(mydate);
  var chosenDay = mydateObj.getUTCDay();
  if( daysOK.indexOf(chosenDay) >= 0 )
    // DAY OK
  else
    // DAY NOT AVALAIBLE
  

测试并运行良好。

【讨论】:

如何检查它是否发生在上午 9 点到下午 7 点的正确时间? 在这种情况下,我不需要检查时间,因为视图限制了您可以选择的时间,而且您永远不能选择非工作时间。 哦,好的。你还能将我的答案标记为正确,以便我得到一些帮助吗?【参考方案3】:

您可以执行以下操作

const isNonBusinessSlot = Boolean((arg.jsEvent.target as htmlDivElement).className === 'fc-non-business');

【讨论】:

以上是关于检测 dayclick 事件的营业时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在fullCalendar中使用addEventSource注册事件?

jQuery完整日历 - 如何防止用户在非工作时间添加事件?

离散事件模型

具有有效期的全日历营业时间

突发事件的下POI数据应对策略

检测某个事件的缺失