Javascript Fullcalendar(v2.x)从eventClick获取日期单元格?

Javascript Fullcalendar(v2.x)从eventClick获取日期单元格?,javascript,events,fullcalendar,Javascript,Events,Fullcalendar,当我点击一个多天(时段)事件(eventClick)时,我正在努力检索点击的日期 单击背景单元格时,很容易: function dayClick(date, jsEvent, view) { //todo: store related day $scope.selectedDay = date; } 但是当点击一个事件时(这是在几天内),我无法检索到用户的确切日期。(我需要根据背景日期执行不同的操作): 我试着玩“可选”,但“eventClick”JS事件不会传

当我点击一个多天(时段)事件(eventClick)时,我正在努力检索点击的日期

单击背景单元格时,很容易:

function dayClick(date, jsEvent, view) {         

   //todo: store related day
   $scope.selectedDay = date;
}
但是当点击一个事件时(这是在几天内),我无法检索到用户的确切日期。(我需要根据背景日期执行不同的操作):

我试着玩“可选”,但“eventClick”JS事件不会传播,也不会“选择”当天

谢谢

,所以我终于找到了一个快速的(&dirty?)解决方案,它依赖于解析封闭的DOM表元素

eventClick
js事件中,我可以检索单击的
currentTarget
并返回
表中的
标题:第一行包含包含单元格日期映射的
thead
标题定义

$scope.alertEventOnClick = function(event, jsEvent, view) {

    var columnIndex = $(jsEvent.currentTarget).parent('td').get(0).cellIndex + 1;
    var parentTable = $(jsEvent.currentTarget).closest('table');
    var dateString = $('thead td:nth-child('+ columnIndex +')', parentTable).attr('data-date');

    $scope.selectedDay = moment(dateString);
};
编辑:每天1个事件的解决方案确定。但每天都有不止一件事


另一种解决方案是确定被点击单元格的x/y位置(通过计算div/td child数),并将其映射到
view.coordMap.grid.cellDates[position]

如果您根本不需要捕捉事件点击,您只需向所有事件添加一个类,其中包含
指针事件:无

IE8 呜呜。有一种黑客方法可以模拟
指针事件:无在IE8上,但在尝试实现它时,我找到了一种更简单的方法来实现目标。(描述了模拟的
指针事件
攻击。)

要获取光标处的日期,请执行以下操作:

  • 隐藏事件表
  • 获取光标下的元素
  • 显示事件表

更好的IE8解决方案 (这似乎不起作用)

因此,锚定标记具有更好的
指针事件:无解决方法

只需将属性
disabled=“disabled”
添加到

以下是我的解决方案:

eventClick: function(event, jsEvent, view) {
    var day=$(this).closest('.'+(view.type=='month'?'fc-row':'fc-time-grid')).find('.fc-bg td:eq('+$(this).closest('td').index()+')').data('date');
    console.log(day);
}

以下是SlicedLoad的解决方案,该解决方案已修改为与fullcalendar的v4一起使用,并考虑了窗口的当前滚动位置:

     eventClick: function(ev) {
        var topLayer = $(ev.el).closest(".fc-row");
        var eventLayer = topLayer.find(".fc-content-skeleton");
        eventLayer.hide();
        var dayElement = $(document.elementFromPoint(ev.jsEvent.pageX - window.pageXOffset, ev.jsEvent.pageY - window.pageYOffset));
        eventLayer.show();
        var current_day = dayElement.attr("data-date");
        console.log(current_day);
     }

我稍微更新了Dane Iracleous的解决方案,使其与1一起工作。当同一天有多个活动时,单击多天活动。二,。它在月/周/日视图中工作

使用可见性/z-index解决了我在隐藏事件层时“全天”容器临时收缩的问题

getClickedDate(event) {
   //used to get specific date clicked on multiple day event
   let topLayer = $(event.el).closest(".fc-row");
   let eventLayer = topLayer.find(".fc-content-skeleton");
   let initialZIndex = $(eventLayer).css('z-index')

   $(eventLayer).css({ 'visibility': 'hidden', 'z-index': '-1'});

   let dayElement = $(document.elementFromPoint(event.jsEvent.pageX - window.pageXOffset, event.jsEvent.pageY - window.pageYOffset));

   $(eventLayer).css({ 'visibility': 'visible', 'z-index': initialZIndex });

   let clickedDate = dayElement.attr("data-date");
   console.log('clicked date', clickedDate)
   return clickedDate;
}

所以,如果是一个3天的事件,用户在事件中间点击,你想要第二天(光标下面的一天)?或者你想要当前的可见周期(视图)?你可能需要对事件显示(即通过EvcInter)做一些重定制。或者玩带有光标坐标的jsEvent。@SlicedLoad是的,我想在第二天玩。另一个解决方案是完全禁用eventClick(在后台只传播dayClick事件),但我不知道这是否可行?感谢如果你需要区分白天点击和活动点击,这可能是最好的方式。我会发布一个答案,只对当天点击有意义。我会放弃这个解决方案,因为它可以处理1个事件,但会在多个事件上中断(fullcalendar的HTML事件结构非常复杂…),这正是我所需要的。。。非常感谢,我不知道这个神奇的css属性。奖金:你有IE8的等价物吗?@Cétia IE8有一个解决方案,但在实现的过程中,我已经有了所需的元素,所以我使用了它。这在浏览器中有效,但我在cordova应用程序中尝试过,它不会触发day click,任何移动解决方案?
eventRender: function (event, element) {
    $(element).addClass('clickThrough').attr("disabled","disabled"); //disabled attribute is a IE workaround for pointer-events
},
eventClick: function(event, jsEvent, view) {
    var day=$(this).closest('.'+(view.type=='month'?'fc-row':'fc-time-grid')).find('.fc-bg td:eq('+$(this).closest('td').index()+')').data('date');
    console.log(day);
}
     eventClick: function(ev) {
        var topLayer = $(ev.el).closest(".fc-row");
        var eventLayer = topLayer.find(".fc-content-skeleton");
        eventLayer.hide();
        var dayElement = $(document.elementFromPoint(ev.jsEvent.pageX - window.pageXOffset, ev.jsEvent.pageY - window.pageYOffset));
        eventLayer.show();
        var current_day = dayElement.attr("data-date");
        console.log(current_day);
     }
getClickedDate(event) {
   //used to get specific date clicked on multiple day event
   let topLayer = $(event.el).closest(".fc-row");
   let eventLayer = topLayer.find(".fc-content-skeleton");
   let initialZIndex = $(eventLayer).css('z-index')

   $(eventLayer).css({ 'visibility': 'hidden', 'z-index': '-1'});

   let dayElement = $(document.elementFromPoint(event.jsEvent.pageX - window.pageXOffset, event.jsEvent.pageY - window.pageYOffset));

   $(eventLayer).css({ 'visibility': 'visible', 'z-index': initialZIndex });

   let clickedDate = dayElement.attr("data-date");
   console.log('clicked date', clickedDate)
   return clickedDate;
}