谷歌图表进入 JQuery Tab 绘制问题

Posted

技术标签:

【中文标题】谷歌图表进入 JQuery Tab 绘制问题【英文标题】:Google charts into JQuery Tab draw issue 【发布时间】:2016-06-22 09:49:34 【问题描述】:

我目前正在尝试移动通过 socket.io 从服务器端提取数据并将其绘制到 JQuery UI 选项卡中的 Google 图表。

遇到的问题是第一个绘制的报告工作正常并且看起来很好。

第二个看起来很错误,我认为这可能与绘制表格的方式有关,但无法找到解决方案,当我只是将其绘制到 JQuery UI 选项卡之外的 div 中时,不会发生此问题。

这是我现在拥有的当前代码:

jQuery(function ($) 
    var socket = io.connect();
    var result = [];
    google.charts.load('current', 
            packages : ['bar']
        );

 $(function() 
    $( "#tabs" ).tabs();
  );

    socket.on("SQLdipo", function (valueArr) 
        google.charts.setOnLoadCallback(drawMaterial);
        var data = valueArr;
        function drawMaterial() 

            var result = [['Call Disposition', 'Answered', 'No Answer', 'Busy','Failed']].concat(valueArr);
            var options = 
                height: 350,
                 chart: 
            title: 'Agent Call Dispositions',
            subtitle: 'Agent call states',
          
            ;
            var chartdata = new google.visualization.arrayToDataTable(result);
            var chart1 = new google.charts.Bar(document.getElementById('chartDipo'));
            chart1.draw(chartdata, options);
        
    );

    socket.on("SQLmins", function (valueArr) 
        google.charts.setOnLoadCallback(drawChart);
        var data = valueArr;
        function drawChart() 

            var result = [['Total Mins', 'Active','Inactive']].concat(valueArr);
            var options = 
                height: 350,
                 chart: 
            title: 'Agent Activity in seconds',
            subtitle: 'Agent Duration Activity',
          
            ;
            var chartdata = new google.visualization.arrayToDataTable(result);
            var chart2 = new google.charts.Bar(document.getElementById('chartMins'));
            chart2.draw(chartdata, options);
        
    );
);

我已经配置了一个 JS fiddle 来模拟 HERE 遇到的问题

【问题讨论】:

【参考方案1】:

问题是图表在最初绘制时是隐藏的。 您可以设置特定的尺寸选项...

等到选项卡被激活,在第一次绘制图表之前,如本例中...

$(document).ready(function() 
  $("#tabs").tabs(
    activate: function(event, ui)
      switch (ui.newTab.index()) 
        case 0:
          drawMaterial();
          break;

        case 1:
          drawChart();
          break;
      
    
  );

  google.charts.load('current', 
    callback: drawMaterial,
    packages: ['bar']
  );

  function drawMaterial() 
    var data = google.visualization.arrayToDataTable([
      ['Call Disposition', 'Answered', 'No Answer', 'Busy', 'Failed'],
      ['1000', 4, 0, 2, 0],
      ['1001', 4, 2, 0, 0],
      ['1002', 6, 0, 0, 0]
    ]);

    var options = 
      height: 350,
      chart: 
        title: 'Agent Call Dispositions',
        subtitle: 'Agent call states',
      
    ;
    var chart1 = new google.charts.Bar(document.getElementById('chartDipo'));
    chart1.draw(data, options);
  

  function drawChart() 
    var data = google.visualization.arrayToDataTable([
      ['Call Disposition', 'Answered', 'No Answer', 'Busy', 'Failed'],
      ['1000', 4, 0, 2, 0],
      ['1001', 4, 2, 0, 0],
      ['1002', 6, 0, 0, 0]
    ]);

    var options = 
      height: 350,
      chart: 
        title: 'Agent Call Dispositions',
        subtitle: 'Agent call states',
      
    ;
    var chart1 = new google.charts.Bar(document.getElementById('chartMins'));
    chart1.draw(data, options);
  
);
<link rel="stylesheet" type="text/css" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div class="tab-div" id="tabs">
  <ul>
    <li><a href="#tabs-1">Call Disposition</a></li>
    <li><a href="#tabs-2">Agent Activity</a></li>
  </ul>
  <div id="tabs-1">
    <div class="report-style" id="chartDipo"></div>
  </div>
  <div id="tabs-2">
    <div class="report-style" id="chartMins"></div>
  </div>
</div>

【讨论】:

遇到的问题是,当我在上面的代码中添加 socket.io 以使用您建议的解决方案时,我无法访问这些功能。 Socket.on?当任何东西从服务器端传递给它时,它就会运行代码和包含在其中的所有内容。你是这个意思吗?是的,我试过了,但我会仔细检查 抱歉,当您说 我无法访问这些功能 时——您的意思是 drawMaterialdrawChart 吗?不熟悉socket.io... 尝试增加宽度,但它什么也没做,是的,我无法访问这些功能 drawMaterialdrawChart 因为上面的 socket.io 根据你给我的例子,我确实有一个解决方法,但这意味着我从服务器端提取信息并将其粘贴到全局变量中,我知道不建议这样做如果您希望我发表建议?【参考方案2】:

我已经根据你给@Whitehat 的建议用我自己的代码修改了它,它工作正常,但这意味着我必须使用我认为不推荐的全局变量。

您对此有何想法或任何建议的更改或改进?

jQuery(function ($) 
    //Global Varibles
    var socket = io.connect();
    var result = [];
    google.charts.load('current', 
            packages : ['bar']
        );

$("#tabs").tabs(
    activate: function(event, ui)
      switch (ui.newTab.index()) 
        case 0:
          drawMaterial();
          break;

        case 1:
          drawChart();
          break;
      
    
  );

    socket.on("SQLdipo", function (valueArr) 
        google.charts.setOnLoadCallback(drawMaterial);
        data1 = valueArr;
    );

    socket.on("SQLmins", function (valueArr) 
        google.charts.setOnLoadCallback(drawChart);
        data2 = valueArr;
    );


        function drawMaterial() 

            var result = [['Call Disposition', 'Answered', 'No Answer', 'Busy','Failed']].concat(data1);
            var options = 
                height: 350,
                 chart: 
            title: 'Agent Call Dispositions',
            subtitle: 'Agent call states',
          
            ;
            var chartdata = new google.visualization.arrayToDataTable(result);
            var chart1 = new google.charts.Bar(document.getElementById('chartDipo'));
            chart1.draw(chartdata, options);
        

        function drawChart() 

            var result = [['Total Mins', 'Active','Inactive']].concat(data2);
            var options = 
                height: 350,
                 chart: 
            title: 'Agent Activity in seconds',
            subtitle: 'Agent Duration Activity',
          
            ;
            var chartdata = new google.visualization.arrayToDataTable(result);
            var chart2 = new google.charts.Bar(document.getElementById('chartMins'));
            chart2.draw(chartdata, options);
        

);

【讨论】:

我现在明白了,谢谢。这很难——而且你必须等待setOnLoadCallback,因为页面会重新加载? 我想是的,它不是一个理想的解决方案,但现在它有效,所以我会将您的回复标记为答案

以上是关于谷歌图表进入 JQuery Tab 绘制问题的主要内容,如果未能解决你的问题,请参考以下文章

试图在依赖于其他数据点的谷歌表格上制作图表

使用 jQuery 和 Flot 插件绘制图表

谷歌图表背景颜色

谷歌图表图例重叠

如何在Scatter Series谷歌图表上绘制自定义多边形?

使用谷歌图表对 JSON API 进行 jQuery 嵌套查询