【问题标题】:Events in jQuery UI Datepicker with json data source带有 json 数据源的 jQuery UI Datepicker 中的事件
【发布时间】:2010-10-25 19:02:35
【问题描述】:

我想在 jQuery UI Datepicker 中显示事件。我希望有事件的日期与没有事件的日期的样式不同,并且我希望在悬停有事件的日期时显示一个包含事件详细信息的自定义工具提示。

问题“jQuery UI Datepicker with jQuery tipsy”的解决方案非常接近,但不适用于我使用的 Datepicker 配置。我使用“showOtherMonths”选项,它会关闭日期链接计算。

事件数据可在http://mydomain.com/events.json获取

我想要的样机:

这是我用于创建 Datepicker 的代码:

$('#dateDiv').datepicker({
    altField: '#dateInput',
    altFormat: 'yy-mm-dd',
    dateFormat: 'yy-mm-dd',
    firstDay: '1',
    showOtherMonths: 'true',
});

我现在不关心解决方案的 CSS 部分,只关心 javascript 部分。当悬停带有附加事件的日期时,如何使我的自定义工具提示出现?以及如何附加事件(日历事件,而不是 javascript/DOM 事件;))?

【问题讨论】:

    标签: javascript jquery json jquery-ui jquery-ui-datepicker


    【解决方案1】:

    这不是一个非常优雅的解决方案,但它似乎确实有效。有人能想出更好的东西吗?

    编辑:这是一个运行代码的 jsFiddle:http://jsfiddle.net/Tobbe/JrkSN/3/

    EDIT2:在我点击一个日期之前它一直有效,然后所有事件都会消失,因为在这种情况下不会调用 beforeShowDay 回调。我该如何解决这个问题?

    getEvents();
    
    $(function() {
        $('#dateDiv').datepicker({
            altField: '#dateInput',
            altFormat: 'yy-mm-dd',
            dateFormat: 'yy-mm-dd',
            firstDay: '1',
            showOtherMonths: 'true',
            beforeShowDay: beforeShowDay,
            onChangeMonthYear: getEvents
        });
    });
    
    var enqueuedDates = [];
    var tryCounter = 0;
    var events = [];
    
    function getEvents() {
        events = [];
        enqueuedDates = [];
        $.getJSON('events.json', function(json) {
            events = json;
        });
    }
    
    function beforeShowDay(date) {
        enqueuedDates.push(new Date(date));
    
        if (enqueuedDates.length == 35) {
            processEnqueuedDates();
        }
    
        return [true, '', ''];
    }
    
    function processEnqueuedDates() {
        if (!events || events.length === 0) {
            tryCounter++;
            if (tryCounter < 100) {
                setTimeout(processEnqueuedDates, 10);
            } else {
                tryCounter = 0;
            }
    
            return;
        }
    
        tryCounter = 0;
    
        for (var i = 0; i < enqueuedDates.length; ++i) {
            var event = getEvent(events, enqueuedDates[i]);
    
            if (event) {
                var theDateCells = $('#dateDiv .ui-datepicker-calendar td');
                var hideTimeoutID;
                theDateCells.eq(i).addClass('eventPlanned').
                    bind('mouseenter', function(eventText) {
                        return function() {
                            if (hideTimeoutID) {
                                clearTimeout(hideTimeoutID);
                                hideTimeoutID = null;
                            }
    
                            var popup = $('#eventPopup');
                            if (popup.size() == 0) {
                                popup = $('<div></div>').attr('id', 'eventPopup');
                                $('body').append(popup);
                            }
    
                            var pos = $(this).offset();
    
                            popup.html('<p>' + eventText + '</p>').
                                css('left', pos.left + 5 + 'px').
                                css('top', (pos.top - popup.height() - 2) + 'px').
                                bind('mouseenter', function() {
                                    clearTimeout(hideTimeoutID);
                                    hideTimeoutID = null;
                                }).
                                bind('mouseleave', function() {
                                    $(this).hide();
                                }).
                                show();
                        }
                    }(event.text)).
                    bind('mouseleave', function(eventObject) {
                        hideTimeoutID = setTimeout(function() {
                            $('#eventPopup').hide();
                        }, 200);
                    });
            }
        }
    }
    
    function getEvent(events, date) {
        return events.filter(function(event, index, arr) {
            return date - $.datepicker.parseDate('yy-mm-dd', event.date) === 0;
        })[0];
    }
    

    【讨论】:

    • 你有没有想过如何处理点击事件消失的事件?
    • 发现您只需要在 onSelect 事件中再次手动调用 beforeShowDay 事件(或用于实际更新/显示事件的任何事件)。
    • 如果您在同一天有多个事件会发生什么,如何让它们全部显示?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多