我正在将 FullCalendar 用于我正在开发的新网站。我有两个带有日历的 div。第一个按预期加载...没有问题。第二是问题。它加载带有按钮和标题的标题,但视图 div 是空的。我检查了错误,没有抛出任何错误。如果我单击任何标题按钮,视图将按预期显示。我认为这可能是两个日历之间的冲突,但似乎不是问题。请参阅下面的代码,让我知道您的想法。我正在使用 Parse 后端,它似乎工作得很好,还有 jQuery。事件调用相同的函数来加载事件,并且它也工作正常。
第一个日历代码:
$('#calendar').fullCalendar({
timezone: 'local',
events: function( start, end, timezone, callback ) {
callback(getEvents(events, start, end));
},
color: 'lightBlue',
textColor: 'gray',
eventMouseover: function( calEvent, jsEvent, view ) {
var $target = $(jsEvent.target).css('cursor', 'pointer');
var location = userData.locations[calEvent.location.id];
var event = userData.events[calEvent.eventData.id];
var options = {
items: $target.parent(),
content: function() {
var info = "Event: <b>" + calEvent.title + "</b><br/><center>" + calEvent.description + "</center><br/>Date: " + moment(calEvent.start).format("MM/DD/YYYY h:mma - ") + moment(calEvent.end).format("h:mma") + '<br/>Frequency: ' + event.get('eventFrequency') + '<br/> Frequency End Date: ' + moment(event.get('eventEndDate')).format('MM/DD/YY') + '<br/>Location: <center>' + location.get("locationName") + '<br/>' + location.get('locationAddress') + location.get('locationAddress2') + "<br>" + location.get('locationCity') + ', ' + location.get('locationState') + ' ' + location.get('locationCountry') + ' ' + location.get('locationPostalCode') + "</center><br/><center>Click Event to Edit";
return info;
}
};
$(view.el).tooltip(options);
},
eventMouseout: function( calEvent, jsEvent, view ) {
$(view.el).tooltip('destroy');
},
eventClick: function(calEvent, jsEvent, view) {
console.log(calEvent);
console.log(jsEvent);
console.log(view);
userData.currentLocation = {};
var location = userData.currentLocation['location'] = userData.locations[calEvent.location.id];
var query = new Parse.Query('Event');
query.equalTo('user', currentUser);
query.equalTo('parent', location);
query.find().then(function(events) {
userData.currentLocation.events = events;
addRow(calEvent.eventData);
$('#add-location').text('Back to Calender').off().one('click',showCalendar);
}, function(error) {
errorMessage(error);
});
},
header: {
left: 'title',
center: '',
right: 'today prev,next'
},
buttonIcons: {
prev: 'left-single-arrow',
next: 'right-single-arrow',
},
dayClick: function(date, jsEvent, view) {
}
});
加载屏幕截图...完美运行。
第二个日历...没那么多。这是代码:
$('#kp-agenda-view').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay'
},
defaultDate: '05-05-2015',
allDay: false,
color: 'lightBlue',
textColor: 'gray',
timezone: 'local',
overlap: false,
editable: true,
buttonIcons: {
prev: 'left-single-arrow',
next: 'right-single-arrow',
},
events: function(start, end, timezone, callback) {
callback(getEvents(userData.currentLocation.events, start, end));
},
})
单击任何标题按钮后(我单击“今天”)...视图已加载
不太确定发生了什么,而且我似乎在网络上找不到任何类似的条目。预先感谢,如果需要更多信息,请告诉我。
我知道这有点太晚了,但看看这个问题: Twitter Bootstrap 选项卡中的完整日历 如果 fullcalendar 位于未显示的元素中,则似乎不会加载它。如果是这种情况,简单的“霰弹枪”解决方案是通过
强制渲染$('#kp-agenda-view').fullCalendar('render');
当日历显示时。
当我看到这篇文章时,我遇到了完全相同的问题。 上面的解决方案意味着调用渲染,对我来说不起作用。
我发现完成这项工作的唯一方法是,在我的例子中,在日历的原始渲染之前将放置日历的 div 不可见变为可见,然后再次使其不可见。
我们所做的是复制第一个日历的所有代码,并将该代码粘贴到原始代码下方,并将所有日历引用重命名为 Calendar2。 这包括同一页面上第二个日历的 div。
一些JS:
// Calendar 2 beginning
var calendarioDiv2 = $('#calendar2');
var fullCalendar = calendarioDiv2.fullCalendar({......)}
//last lines fo JS
$(window).on('load', function() {
$('#calendar').fullCalendar('render');
$('#calendar2').fullCalendar('render');
});
在调用 fullCalendar 方法之前的一个小解决方法
setTimeout(function () {
$('#kp-agenda-view').fullCalendar('render');
});
它对我有用。
我的工作
setTimeout(() => {
$('#kp-agenda-view').fullCalendar('render');
}, 1000)
有同样的问题。我的问题是选项卡容器渲染动画。根据 docs,方法
fullcalendar.render()
尝试仅在可见容器中渲染日历网格。因此,如果您在单击选项卡后立即触发 fullcalendar.render()
,但在渲染日历的选项卡容器上确实有一些动画(例如“淡入”动画,这显然需要一些时间来执行),那么就准备好捕获选项卡没有日历网格的容器。
或者这种情况,解决方案将与此类似:
$("#calendarTab").click(function (e) {
e.preventDefault();
setTimeout(function () {
$("#fullCalendar").fullCalendar("render");
}, 300); // Set enough time to wait until animation finishes;
});
有同样的问题。 (在我的例子中,日历被放置在不可见的 div 中) 解决方案:在渲染日历之前,显示日历。并在日历呈现后隐藏日历。
var calendarEl = document.getElementById('calendar');
var calendar = new Calendar(calendarEl, { height: 300,
plugins: [ 'bootstrap', 'interaction', 'dayGrid', 'timeGrid' ],
header : {
left : 'prev,next today',
center: 'title',
right : 'dayGridMonth'
},
I just give a height then my issue is solved.
在我的例子中,包含日历 div 的视图是使用 ajax 和 jQuery 动态添加的。并且日历(FullCalendar)第一次没有加载/渲染。
但是,当我检查元素时,它立即被渲染了。
我使用了 setTimeOut 并且它有效。工作代码如下。
<script type="text/javascript">
$(function () {
//Until the data was not rendered. I was showing a loader to engage the users. Just you need to change the image path
showLoader("#lxgEventsCalendar");
//Creating a delay of 500 ms
setTimeout(function () {
loadFullCalData();
}, 500);
});
function loadFullCalData() {
var calendarEl = document.getElementById('lxgEventsCalendar');
var calEvents = [
{
title: 'All Day Event',
start: '2021-11-01'
},
{
title: 'Long Event',
start: '2021-11-07',
end: '2020-11-10'
},
{
groupId: '999',
title: 'Repeating Event',
start: '2021-11-09T16:00:00'
},
{
groupId: '1',
title: 'Meetings with Share Holders',
start: '2021-11-14T16:00:00'
},
{
groupId: '2',
title: 'Meeting with Sam & Co',
start: '2021-11-15T16:00:00'
},
{
groupId: '3',
title: 'Meeting with MDT Polymers',
start: '2021-11-19T16:00:00'
}];
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
headerToolbar: {
center: 'title',
start: 'today prev,next',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
},
dateClick: function (info) {
var markup = "<div class=\"form-horizontal\"><div class=\"form-group\"><label class=\"control-label col-lg-3\">Date Selected</label> <div class=\"col-lg-6\">" + info.dateStr + "</div> </div></div>";
showAlert(info.dateStr);
},
events: calEvents
});
calendar.render();
}
function showLoader(divSelector) {
var loaderMarkup = "<div id='imgLoader' class='loader-img' style='width: 100%;margin: 0px auto 0px auto; padding: 10px 0; text-align:center;overflow: hidde;'><img style='margin: 0px auto 0px auto;' src='../../images/waiting_animation_circle.gif'/></div>";
$(divSelector).html(loaderMarkup);
}
</script>
<div id='lxgEventsCalendar' class="col-lg-12"></div>
这对我有用。
替换:
calendar.render();
对于:
setTimeout(function () {
calendar.render();
}, 2000);
希望对你有帮助