2012-10-22 49 views
0

我已成功将Flot折线图和FullCalendar实例整合到我的网站中。它们都在单独的页面上(尽管通过AJAX将页面加载到div中)。FullCalendar和Flot调整大小冲突

我已经添加了Flot Resize插件,并且完美地工作,按预期重新调整线条图的大小。但是,调整日历大小时似乎会导致错误。

即使我第一次加载日历页面,当我调整窗口,我得到这个错误在控制台(同时,在日历不正确调整大小):

TypeError: 'undefined' is not an object (evaluating 'r.w=o!==c?o:q.width()') 

我挣扎着在哪里工作错误来自于,所以我删除了Flot Resize JS的链接并再次尝试。当然,折线图不会调整大小,但在调整日历大小时,它可以正常工作。

两个元素的div容器具有不同的名称,并且调用函数内的resize函数以根据需要绘制折线图。

我试着将链接移动到Flot Resize插件到不同的地方(即fullCalendar JS上面/下面,保存图的模板),但都无济于事。

有没有人有任何想法冲突可能会在哪里,我可能会解决它?

非常感谢!

编辑:看起来,即使没有调整窗口的大小,在加载完整日历页面后的线图(flot)页面也会触发错误....现在我非常困惑!

编辑2:绘制线条图的代码。该函数在pageload上调用,并接收从服务器上取下的JSON数据。当图加载时,我仍然得到关于shutdown()未定义的错误。

function plotLineGraph(theData){ 
var myData = theData['data']; 
var myEvents = theData['events']; 
var myDates = theData['dates']; 

var events = new Array(); 
for (var i=0; i<myEvents.length; i++) { 
    events.push(
     { 
      min: myEvents[i][0], 
      max: myEvents[i][1], 
      eventType: "Calendar Entry", 
      title: myEvents[i][2], 
      description: myEvents[i][3] 
     } 

    ); 
} 

    function showTooltip(x, y, contents) { 
    $('<div id="tooltip">' + contents + '</div>').css({ 
     position: 'absolute', 
     display: 'none', 
     top: y + 5, 
     left: x + 5, 
     border: '1px solid #fdd', 
     padding: '2px', 
     'background-color': 'black', 
     opacity: 0.80 
    }).appendTo("body").fadeIn(200); 
} 

var previousPoint = null; 
$("#placeholder").bind("plothover", function (event, pos, item) { 
    $("#x").text(pos.x.toFixed(2)); 
    $("#y").text(pos.y.toFixed(2)); 

    if ($("#enableTooltip:checked").length == 0) { 
     if (item) { 
      if (previousPoint != item.dataIndex) { 
       previousPoint = item.dataIndex; 

       $("#tooltip").remove(); 
       var x = item.datapoint[0].toFixed(2), 
        y = item.datapoint[1].toFixed(2); 

       if(item.series.label != null){ 
       showTooltip(item.pageX, item.pageY, 
          item.series.label + " of " + y); 
       } 
      } 
     } 
     else { 
      $("#tooltip").remove(); 
      previousPoint = null;    
     } 
    } 
}); 

var d1 = [ 
      myData[0], myData[1], myData[2], myData[3], myData[4], 
      myData[5], myData[6], myData[7], myData[8], myData[9], 
      myData[10], myData[11], myData[12], myData[13], myData[14], 
      myData[15], myData[16], myData[17], myData[18], myData[19], 
      myData[20], myData[21], myData[22], myData[23], myData[24], 
      myData[25], myData[26], myData[27], myData[28], myData[29] 
      ]; 
var markings = [ 
    { color: '#FFBDC1', yaxis: { from: 0, to: 2 } }, 
    { color: '#F2E2C7', yaxis: { from: 2, to: 3.5 } }, 
    { color: '#B6F2B7', yaxis: { from: 3.5, to: 5 } } 
]; 

$.plot($("#placeholder"), [ 
    {label: "Average Daily Rating", data: d1, color: "black"} 
    ], { 
     events: { 
      data: events, 
     }, 
     series: { 
      lines: { show: true }, 
      points: { show: true } 
     }, 
     legend: { show: true, container: '#legend-holder' }, 
     xaxis: { 
      ticks:[ 
      myDates[0], myDates[1], myDates[2], myDates[3], myDates[4], 
      myDates[5], myDates[6], myDates[7], myDates[8], myDates[9], 
      myDates[10], myDates[11], myDates[12], myDates[13], myDates[14], 
      myDates[15], myDates[16], myDates[17], myDates[18], myDates[19], 
      myDates[20], myDates[21], myDates[22], myDates[23], myDates[24], 
      myDates[25], myDates[26], myDates[27], myDates[28], myDates[29] 
      ], 
     }, 
     yaxis: { 
      ticks: 5, 
      min: 0, 
      max: 5 
     }, 
     grid: { 
      backgroundColor: { colors: ["#fff", "#eee"] }, 
      hoverable: true, 
      clickable: true, 
      markings: markings 
     }, 
     selection: { 
      color: 'white', 
      mode: 'x' 
     }, 
}); 
$('#placeholder').resize(); 
$('#placeholder').shutdown(); 
} 

EDIT 3:

日历称为这样的:

function showCalendar() { 
    var date = new Date(); 
var d = date.getDate(); 
var m = date.getMonth(); 
var y = date.getFullYear(); 

$('#fullcalendar').fullCalendar({ 
    header: { 
     left: 'prev', 
     center: 'title', 
     right: 'next' 
    }, 
    clickable: true, 
    firstDay: 1, 
    eventSources: [ 
     { 
      url: '/populate-calendar/{{theProductUuid}}/', 
      color: 'black', 
      data: { 
       text: 'text' 
      } 
     } 
    ], 
    eventClick: function(calEvent, jsEvent, view) { 
     var startDate = $.fullCalendar.formatDate(calEvent.start, 'yyyy-MM-dd'); 
     var endDate = $.fullCalendar.formatDate(calEvent.end, 'yyyy-MM-dd'); 
     var eventId = calEvent.uuid; 
     $('#modal-event-title').text(calEvent.title); 
     $('#edit-event-name').val(calEvent.title); 
     $('#edit-start-date').val(startDate); 
     $('#edit-end-date').val(endDate); 
     $('#edit-event-text').val(calEvent.text); 
     $('#edit-event-btn').attr('data-uuid', eventId); 
     $('#modal-edit-event').on('click', '#delete-btn', function(){ 
      deleteCalendarEvent(eventId); 
     }); 
     $('#modal-edit-event').modal(); 
     }, 
}); 

} 

的AJAX来加载包含海军报图表的页面:

function loadDetailedReports(uuid){ 
$('#product-content').fadeOut('slow', function(){ 
    $('#product-content').empty(); 
    $('#whole-product-sub-nav .active').removeClass('active'); 
    $('#detailed-reports-content').load('/detailed-reports/' + uuid + '/', function(){ 
     $('#detailed-reports-btn').addClass('active'); 
     $('#detailed-reports-content').fadeIn('slow', function(){ 
      if (authorized){ 
       setLocationHash('loadDetailedReports&' + uuid); 
       getChartData(uuid); 
      } else { 
      setLocationHash(''); 
      } 
     }); 
    }); 
}); 
} 

而AJAX来加载包含日历的页面:

function loadCalendar(uuid){ 
$('#detailed-reports-content').empty().hide(); 
$('#product-content').fadeOut('slow', function(){ 
    $('#whole-product-sub-nav .active').removeClass('active'); 
    $('#product-content').load('/calendar/' + uuid + '/', function(){ 
     $('#calendar-btn').addClass('active'); 
     $('#product-content').fadeIn('slow', function(){ 
      if (authorized){ 
       setLocationHash('loadCalendar&' + uuid); 
      } else { 
       setLocationHash(''); 
      } 
      showCalendar(); 
     }); 
    }); 
}); 
} 

调用.resize和.shutdown在那里,因为我的印象是,他们需要实现调整大小的功能,并回应您先前关于关机的评论......他们很可能n00b错误........?!?!

+0

Flot调整大小包括Ben Alman的jquery-resize插件的内联副本。这听起来像是和日历之间有冲突,因为我们还没有收到任何其他产生这种错误的调整报告。日历如何进行大小调整? – DNS

+0

Automagically ......! FullCalendar似乎具有内置的调整大小功能。通过JS文件的快速搜索可以发现fullcalendar.js中的windowResize函数 – Erve1879

+0

好的,所以它不使用jquery调整大小或其他任何东西的副本。这个错误到底在哪里?它在flot.js,flot.resize.js或其他地方吗?什么行号? – DNS

回答

0

看起来这是一个触发jQuery的调整大小的198线:

data.w = w !== undefined ? w : elem.width(); 

这听起来像一个竞争条件与方式所产生加载不同的内容转换成同一div。 Flot将resize事件绑定到图表div,并且只有在剧情被彻底销毁时才解除绑定。

编辑:看看你的代码,我的第一个建议是在plotLineGraph结束时去掉调整大小和关闭调用。调整大小插件不需要任何设置;它会挂钩到Flot中以自动附加到任何新图。所以你调用resize实际上是jQuery的resize事件触发器,这可能是导致错误的原因。编辑#2:我仍然不清楚你的结构,但泛化:任何地方,你可能会摆脱#placeholder(通过清空它的父母或类似的东西),你应该首先调用关闭的情节目的。如果你没有提及它,你可以这样做:$("#placeholder").data("plot").shutdown();但是必须说明它在创建第一个图之前未定义的事实。

如果这仍然不起作用,我需要看一个现场(简化)的例子,以提出进一步的建议。

+0

谢谢DNS - 我会先尝试加载到不同的div,然后回来。 – Erve1879

+0

好吧,我认为这是问题(图表div并没有被彻底销毁),但是你能否建议最简单的方法来清除它?在包含div(即'#placeholder.parent()')上调用'.empty()'还是需要更多的'大量的'销毁......? – Erve1879

+0

在你之前调用plot对象的shutdown()空(或摆脱它)应该做的伎俩。 – DNS