8

我正在使用 Twitter Bootstrap 框架的网页中通过 Google Chart Tools 创建图表。显示了三种类型的图表 - 饼图、折线图和柱形图,每种都在单独的选项卡中。图表数据通过 Ajax 接收。

通过 Ajax 接收数据后,图表立即显示良好。但是,如果我移动到另一个选项卡,即另一个图表,然后返回到第一个选项卡,图表中的标签会错误地重新对齐。

此处包括显示问题的图像,在选项卡更改之前和之后: 选项卡更改前的图表 选项卡更改后的图表

折线图和柱形图也会出现此问题。

但是,如果我更改窗口然后返回,或者如果我隐藏然后重新显示图表,则不会出现问题。仅当我更改选项卡时才会发生。

选项卡的标记如下:

    <div class="charts-div" style="text-align: center">
            <ul class="nav nav-tabs">
                <li class="active"><a href="#tab-pie" data-toggle="tab">Pie</a></li>
                <li><a href="#tab-line" data-toggle="tab">Line</a></li>
                <li><a href="#tab-column" data-toggle="tab">Columns</a></li>
            </ul>
            <div class="tab-content">
                <div class="tab-pane active" id="tab-pie">
                    <div class="chart pie-chart" id="pie-prt"></div>
                </div>
                <div class="tab-pane" id="tab-line">
                    <div class="chart line-chart" id="line-prt"></div>
                </div>
                <div class="tab-pane" id="tab-column">
                    <div class="chart column-chart" id="column-prt"></div>
                </div>
            </div>

    </div>

在 Chrome 22、IE9 和 Firefox 12 中检查。结果是一样的。我没有为选项卡更改或选项卡焦点事件编程额外的代码/事件。

4

2 回答 2

7

正如 mohitp 所指出的,davidkonrad 的解决方案存在一些缺点。如果您仍然希望图表在绘制后仍能正常工作(即工具提示),那么您将不得不使用 Javascript 重新绘制图表。

给定 David 的示例(减去虚拟位移代码)只需将带有选项和数据表的图表变量完整地移动到全局范围并再次调用 draw 方法,您可以在此处查看此示例:redraw-google-chart

以 David 的示例为例,一旦您在全局范围内获得图表和图表信息,您需要将以下内容绑定到选项卡的显示事件,如下所示:

$('a[data-toggle="tab"]').on('shown', function (e) {
    chart.draw(data, options);
  })

在我自己的应用程序中,我根据服务器端 json 请求绘制图表,并且在某些情况下,我可能在单个页面上有许多图表,因此我将图表和图表信息附加到可以重新处理的全局范围数组中客户端根据需要多次。

于 2012-11-08T19:31:32.147 回答
1

是的,使用您的标记和https://google-developers.appspot.com/chart/interactive/docs/quick_start上的饼图示例非常容易复制(nix/各种浏览器)

在将文本绘制到隐藏选项卡时,API 似乎扩展了 SVG 的中间中心。但是我找到了解决方法:将图表/线条/条绘制到虚拟元素并立即将它们移动到选项卡容器。

上面更改的图表示例:

function drawChart(id) {
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'Topping');
    data.addColumn('number', 'Slices');
    data.addRows([
      ['Mushrooms', 3],
      ['Onions', 1],
      ['Olives', 2],
      ['Zucchini', 1],
      ['Pepperoni', 2]
    ]);
    var options = {'title':'How Much Pizza I Ate Last Night',
                   'width':400,
                   'height':300};

    var chart = new google.visualization.PieChart(document.getElementById('dummy'));
    chart.draw(data, options);
    $('#dummy').children().remove().appendTo('#'+id);
  }

在代码中的某处添加

<div id="dummy"></div>

绘制图表(通过 dummy 到你的 .. class="chart xxx" id="xxx-prt"

<script type="text/javascript">
$(document).ready(function() {
    drawChart('pie-prt');
    drawChart('line-prt');
    drawChart('column-prt');
});
</script>

然后图表在不同的选项卡上以相同的方式呈现,这是一个小提琴http://jsfiddle.net/sjW6Z/证明它确实有效:)

于 2012-10-30T10:53:19.480 回答