【问题标题】:Google Charts and Twitter Bootstrap tabsGoogle Charts 和 Twitter Bootstrap 选项卡
【发布时间】:2012-10-18 14:23:36
【问题描述】:

我正在使用 Twitter Bootstrap 框架的网页中通过 Google 图表工具创建图表。显示了三种类型的图表 - 饼图、折线图和柱形图,每种都在单独的选项卡中。图表数据通过 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 中检查。结果是一样的。我没有为选项卡更改或选项卡焦点事件编写额外的代码/事件。

【问题讨论】:

    标签: twitter-bootstrap google-visualization


    【解决方案1】:

    正如 mohitp 所指出的,davidkonrad 的解决方案存在一些缺点。如果您仍然希望图表在绘制它们后保持功能(即工具提示),那么您必须使用 Javascript 重新绘制图表。

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

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

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

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

    【讨论】:

    • 今天,我遇到了与 mohitp 描述的相同的问题,但再次致电 chart.draw() 并没有帮助。最后,我通过在shown 事件处理程序(例如:chart=new google.visualization.PieChart(...))中创建图表对象来解决这个问题,在div 尺寸有些固定之后。
    • 您在调用chart.draw时是否确保传递了所有参数?
    • 这样的例子怎么能起作用:jsfiddle.net/Khrys/axr7h?谢谢
    • @Khrys 有多个图表?我想你只需给每个选项卡一个唯一的选择器,然后将 drawChart 函数单独绑定到每个选项卡显示事件。
    • 感谢您的宝贵时间。你能给我一个例子吗?我在这里提出了一个问题:stackoverflow.com/questions/23616897/… 对于这种情况。再次感谢。
    【解决方案2】:

    是的,使用您的标记和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>
    

    绘制图表(通过您的 ..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/ 证明它确实有效:)

    【讨论】:

    • 这确实消除了标签缺陷。但是在将鼠标悬停在饼图或列上时要显示的文本未显示,并且存在 javascript 错误:Uncaught TypeError: Cannot read property 'nodeType' of null
    • 您在哪里描述了悬停问题?例如“要显示的文本”?我应该怎么猜到你的 HTML 标记?对我来说,我解决了你的问题。无论如何,只有解决方案,没有问题。对我的客户来说,如果替代方案根本不显示一个像样的图表,我可以忍受 typeerror。
    • 你似乎很生气。我只是想表达现在还有另一个问题,这个修复。当然,你已经解决了。之前没有鼠标悬停问题,所以我没有提到它。鼠标悬停文本是图表的tooltip/focusTarget属性,每个图表在javascript中设置,程序员端不需要手动标记。
    猜你喜欢
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2013-08-27
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多