5

我已经启动并运行了 FullCalendar,它非常好。我的问题是如何最好地实现时隙悬停功能。如果用户可以在他们悬停的任何给定时间段上获得视觉提示,那将是非常好的。

我找到了以下链接http://code.google.com/p/fullcalendar/issues/detail?id=269,它提供了一个在议程单元格行中添加新结构以提供对单个单元格的访问的解决方案。但是,表明此解决方案将导致 FullCalendar 变得迟缓。

在我开始研究 FullCalendar 代码之前,我想我会问其他人是否有任何想法或解决方案。

我对接近这个的想法如下:

  1. 将占位符事件添加到每个时间段。用户不会看到这些事件,但这些不可见的事件可用于允许“悬停”标记。我在这里担心的是,添加额外的事件会导致 FullCalander 变得迟缓。此外,拖放功能可能会受到影响。

  2. FullCalender 可以确定用户单击的时间段。是否可以使用获取时间段单击的代码来为悬停突出显示提供参考?

  3. 其他?

我正在考虑将选项 2 作为开始的地方。但是,如果有人对可行的解决方案有其他想法,我会很高兴听到。

如果我想出一个解决方案,我会在这里发布。

谢谢,

吉姆

这是 FullCalendar 站点的链接:http://fullcalendar.io/
发现使用它非常好。

4

3 回答 3

5

下面的代码对我有用。

$('.ui-widget-content').hover(function(){
    if(!$(this).html()){    
        for(i=0;i<7;i++){
            $(this).append('<td class="temp_cell" style="border: 0px; width:'+(Number($('.fc-day').width())+2)+'px"></td>');
        }

        $(this).children('td').each(function(){
            $(this).hover(function(){
                $(this).css({'background-color': '#ffef8f', 'cursor': 'pointer'});
            },function(){
                $(this).prop('style').removeProperty( 'background-color' );
            });
        });
    }
},function(){
    $(this).children('.temp_cell').remove();
});

确保在实例化日历的代码之后添加它,如果 JQuery 日历的 defaultView 属性是“AgendaWeekly”,它应该按原样工作。

干杯,米

于 2014-11-12T10:05:46.893 回答
2

我遇到了同样的问题,因为有时很难看到您实际点击的是哪个时间段。为了解决这个问题,我写了一行来改变 fullcalendar.js。不是理想的解决方案,但它是一个快速修复。

这是行:

"<input type='hidden' class='timeslot-value' value='" + formatDate(d, opt('axisFormat')) +"'>" +

并将其放置在内部(代码行 3080 附近):

"<th class='fc-agenda-axis " + headerClass + "'>" +
((!slotNormal || !minutes) ? formatDate(d, opt('axisFormat')) : '&nbsp;') +
"</th>" +
"<td class='" + contentClass + "'>" +
"<input type='hidden' class='timeslot-value' value='" + formatDate(d, opt('axisFormat')) +"'>" +
"<div style='position:relative'>&nbsp;</div>" +
"</td>" +

现在,您只需将工具提示悬停在所有具有 .ui-widget-content 类的 fc-slot 上(<td>您在上面的代码中看到)。并获取隐藏的输入值以显示在该工具提示中。

如果是 jQuery,您可以使用 live 事件并获取相应的第一个孩子并获取其值。

如果 extJS

Ext.onReady(function(){

Ext.QuickTips.init();

var tip = Ext.create('Ext.tip.ToolTip', {
    target: 'your-calendar-id',
    width: 140,
    minHeight: 30,
    delegate: '.ui-widget-content',
    autoHide: false,
    renderTo: Ext.getBody(),
    listeners: {
        beforeshow: function updateTipBody(tip) {
            tip.update('<dl><dt style="font-weight: 600;"><?php echo $this->translate('Start time')?>: </dt><dd>' + Ext.get(this.triggerElement).first().getValue() + '</dd></dl>');
        }
    }
}); 
});
于 2012-08-07T10:48:01.270 回答
1

我意识到这实际上不是一个答案,而是对先前答案的评论,但我还没有达到评论答案的声誉。

WRT 对@user4243287 的回答我必须采取的一个额外步骤是在初始化我的日历时将此逻辑放在“viewRender”选项中,以确保在几周之间移动时它继续工作。

于 2016-12-02T22:16:32.690 回答