fullcalendar 在 IE 中不渲染事件(所有版本)

fullcalendar does not renderEvent in IE (All versions)

我正在使用 fullcalendar 渲染一些事件。

Fiddle here - 按一天并在文本框中输入数字

完整日历"setup"如下:

 $(document).ready(function () {
    // page is now ready, initialize the calendar...
    $('#calendar').fullCalendar({
        header: false,
        defaultView: 'basicWeek',
        height: 300,
        firstDay: 1,
        columnFormat: 'ddd D/MM',
        dayClick: function (date, jsEvent, view) {
            if (date > new Date()) {
                $('#lateralert').show();
                setInterval(function () { $('#lateralert').hide(); }, 4000);
            } else {
                $('#AddEventModal').modal('show');
                var modal = $('#AddEventModal');
                document.getElementById('hiddendate').value = date.toString();
                modal.find('.modal-title').text((moment(date).format('ddd D/MM')));
            }
        },
        events: [
            {
                title: '3',
                start: '2015-04-13',
                backgroundColor: '#e74c3c',
                borderColor: '#e74c3c'
            },
            {
                title: '4,5',
                start: '2015-04-13',
                backgroundColor: '#3498db',
                borderColor: '#3498db'

            },
            {
                title: '2',
                start: '2015-04-13',
                backgroundColor: '#95a5a6',
                borderColor: '#95a5a6'
            }
        ]
        // put your options and callbacks here
    });

});

我通过一个表单提交这些事件,我在其中捕获提交并添加事件。

 $(document).ready(function () {
    $('#event_frm').on('submit', function (e) {
        e.preventDefault();

        var form = document.getElementById('event_frm');

        var date = form.elements["hiddendate"].value;
        var hours = form.elements["hours"].value;

        $('#calendar').fullCalendar('renderEvent',
        {
            title: hours,
            start: date,
            allDay: true,
            description: 'my desc'
        });

        window.hasMadeChanges = true;

        $('#discardchanges').prop('disabled', false);
    });
});

以上在 Firefox 中工作正常,我试过在 IE 中调试它,但没有错误,并且代码执行(根据调试器),但在使用 IE 9 时没有事件添加到日历-> 边缘。

我是不是漏掉了一些明显的东西?

在 Firefox 中:

在 IE 中:

好的,发现两个问题并在 IE9 中运行。

Fullcalendar 使用 momentjs 处理所有与日期相关的内容。如果您将插入日期硬编码为片刻,您会注意到它在 IE 中有效。

$('#calendar').fullCalendar('renderEvent',{          
    title: hours,
    start: moment(),
    allDay: true,
    description: 'test'
});

所以我们知道您提供的开始日期有问题。一会包起来差不多就可以了:

var date = form.elements["hiddendate"].value;
$('#calendar').fullCalendar('renderEvent',{          
    title: hours,
    start: moment(date),
    allDay: true,
    description: 'test'
});

但是现在事件是添加到前一天的。

如果您查看获得该日期值的位置:

document.getElementById('hiddendate').value = date.toString();

toString 不应该用于存储日期。我实际上不确定它的用途(docs 使用过一次但从不谈论它)。

并且在您的控制台中,您会在执行 moment(date) 时注意到弃用警告。警告说它返回到 Date 构造函数,因为它无法解析字符串。这就是 IE 的不同之处,因为 Date 对象依赖于浏览器。 Date 在 FF 上可以读取字符串,但在 IE 上 Date 不能。

相反,使用 moment.format() 生成一个可以读取的字符串。所以:

document.getElementById('hiddendate').value = date.format();
//...
$('#calendar').fullCalendar('renderEvent',{          
    title: "a",
    start: moment(date),
    allDay: true,
    description: 'test'
});

这个 JSFiddle 现在应该可以工作了。

此外,行:

if (date > new Date()) {

应该

if (date.isAfter(moment())) {

令我惊讶的是,前者甚至可以工作,但如果不支持,可能无法完美工作。不要混合日期类型(除非你将 Date 包裹在 moment() 中)。