Javascript 一页上有多个完整日历

Javascript 一页上有多个完整日历,javascript,fullcalendar,Javascript,Fullcalendar,我正在使用FullCalendar.js插件创建一个包含多个日历的页面。正如在示例中一样,我能够将外部事件拖到每个日历上。只有在使用其中一个日历中的下一个方法prev更改视图后,我才能再将事件拖到其他日历上。当我将一个外部事件拖到日期单元格上时,它们不会高亮显示,drop也不起作用 请注意,单独拖动每个日历中已经创建的事件仍然可以正常工作。但是,外部事件的拖放仅适用于我更改/上一个/下一个日期的日历 请注意,我不想在各种日历之间拖动事件 我尝试了一小段javascript,通过触发剩余日历的“p

我正在使用FullCalendar.js插件创建一个包含多个日历的页面。正如在示例中一样,我能够将外部事件拖到每个日历上。只有在使用其中一个日历中的下一个方法prev更改视图后,我才能再将事件拖到其他日历上。当我将一个外部事件拖到日期单元格上时,它们不会高亮显示,drop也不起作用

请注意,单独拖动每个日历中已经创建的事件仍然可以正常工作。但是,外部事件的拖放仅适用于我更改/上一个/下一个日期的日历

请注意,我不想在各种日历之间拖动事件

我尝试了一小段javascript,通过触发剩余日历的“prev”、“next”方法来同步更改日历的日期。在这种情况下,拖放仅适用于日期更改的最后一个日历

这是一种奇怪的行为。FullCalendar是否使用一些全局设置等,这些设置可能会影响一页上的其他日历实例?我调试了由“prev”、“next”等调用的方法,但似乎没有全局更改任何内容


我在单独的元素中创建日历。

FullCalendar在html文档上为“mousedown”和“dragstart”注册事件处理程序,以便外部删除事件。这些处理程序函数首先使用$.proxy绑定到特定上下文,然后使用jQuery函数.on和.off添加/删除到文档中。jQuery文档说明了.off与.proxy的用法:

由jQuery.proxy或类似机制代理的处理程序将 与代理函数具有相同的唯一id,因此传递代理 处理程序到.off可能会删除比预期更多的处理程序。在那些 在某些情况下,最好使用 名称空间

在FullCalendar中导航,取消选择prev、next按钮等,会调用当前视图Monthview等的重画,这涉及到销毁当前视图和分离文档事件处理程序:

// taken from FullCalendar.js 2.1.1
destroy: function() {
    this.unselect();
    this.trigger('viewDestroy', this, this, this.el);
    this.destroyEvents();
    this.el.empty(); // removes inner contents but leaves the element intact

    $(document)
        .off('mousedown', this.documentMousedownProxy)
        .off('dragstart', this.documentDragStartProxy);    // all handlers removed here
},
由于$.proxy为单独的FullCalendar实例的事件处理程序提供了相同的标识符,因此此调用将分离所有实例的处理程序

一个快速的解决方案是为事件使用名称空间。我在FullCalendar和atach中的view类内生成一个唯一的事件命名空间,并使用该命名空间分离相应的事件:

View.prototype = {

    // ...

    // declare namespace 
    documentEventNamespace: null,

    init: function() {

        // ...

        // define namespace, simply with random number
        this.documentEventNamespace = "fcDocumentEvents" + parseInt(Math.random() * 1000);
    },

    render: function() {

        // ...

        // use namespace for events
        $(document)
            .on('mousedown.' + this.documentEventNamespace, this.documentMousedownProxy)
            .on('dragstart.' + this.documentEventNamespace, this.documentDragStartProxy); // jqui drag
    },


    // Clears all view rendering, event elements, and unregisters handlers
    destroy: function() {

        // use namespace for events
        $(document)
            .off('mousedown.' + this.documentEventNamespace, this.documentMousedownProxy)
            .off('dragstart.' + this.documentEventNamespace, this.documentDragStartProxy);
    },

    // ...
}
这是一个可行的方法,但我更喜欢不涉及FullCalendar.js代码的解决方案。也许其他人对此有所暗示,或者FullCalendar将在将来的更新中使用事件名称空间