【问题标题】:Difference between HTML5/JavaScript and jQuery based chart libraries基于 HTML5/JavaScript 和 jQuery 的图表库之间的区别
【发布时间】:2012-06-29 03:56:47
【问题描述】:

我对客户端 Web 开发还很陌生,所以请随意编辑我的问题,如果有什么没有多大意义的话。

关于基于 HTML5/JavaScript 和 jQuery 的图表库,让我来看看 RGraph(命名为 HTML5/JavaScript 图表)和 HighCharts(命名为 jQuery 下的 JavaScript 图表)框架)例如。

RGraph 使用<canvas> 标签来显示生成的图表,如其文档中的示例所示。然而 HighCharts 使用<div> 标签作为他们图表的占位符。

我正在尝试像 RGraph 那样将 HighCharts 放入 <canvas> 标记中(这对你来说可能听起来很奇怪......我不知道),图表将无法显示。反过来,如果我将 RGraph 图表作为 HighCharts 放入 <div> 占位符,也会出现同样的问题。

我所看到的只是占位符,所有花哨的交互操作都被 JavaScript 抑制了。那么为什么会出现上述问题?我相信 RGraph 和 HighCharts 之间的一些配置差异可能是有原因的,但不知道那些是什么......

<canvas><div> 标签中渲染图表有什么区别?

~~~~~~~~~~~~~~~~~

以下是我的演示脚本:

RGraph 放入 <canvas>,效果很好:

<!DOCTYPE html>
<html>
    <head>

        <script>
                Scripts go here 
        </script>

    </head>
    <body>

        <div>
            <h1>Basic RGraph Example</h1>
            <h2>Line Chart</h2>
            <canvas id="line" width="400" height="300"></canvas>
            <h2>Pie Chart</h2>
            <canvas id="pie" width="400" height="300"></canvas>
            <h2>Bar Chart</h2>
            <canvas id="bar" width="400" height="300"></canvas>

        </div>

    </body>
</html>

如果我将图表放入&lt;div&gt; 标签,则不起作用:

<!DOCTYPE html>
<html>
    <head>

        <script>
                Scripts go here 
        </script>

    </head>
    <body>

        <div>
            <h1>Basic RGraph Examples</h1>
            <h2>Pie Chart</h2>
            <div id="line" width="400" height="300"></div>
            <h2>Line Chart</h2>
            <div id="pie" width="400" height="300"></div>
            <h2>Bar Chart</h2>
            <div id="bar" width="400" height="300"></div>

        </div>

    </body>
</html>

感谢任何 cmets。谢谢!

【问题讨论】:

    标签: jquery html canvas highcharts


    【解决方案1】:

    首先:&lt;canvas&gt; 是对 HTML 标准的一个相对较新的补充,并不是所有浏览器或版本都普遍支持。但是,它可能是高效可靠地显示此类信息的最佳选择。

    至于你的内容在使用其他标签时没有显示的原因:


    &lt;canvas&gt; 标签允许您指定后备内容。比如下面的sn-p:

    <canvas>Your browser does not support the canvas tag!</canvas>
    

    支持&lt;canvas&gt;标签的浏览器上将显示为Your browser does not support the canvas tag!,但在支持&lt;canvas&gt;标签的浏览器上,将插入一个300x150的画布,并显示为一个透明框。


    在相反的情况下,尝试使用像 &lt;div&gt; 这样的常规标签并使用像 canvas 这样的特定操作(如 getContext())将不会做任何事情,甚至在未处理的情况下会引发错误。

    这两个库都不太可能处理这些使用场景,并且要么静默失败,要么将大量调试信息注入您的控制台。


    这两种方法的主要区别在于&lt;canvas&gt; 渲染直接将像素/线条/文本绘制到“渲染上下文”中,并且出于多种原因可以更好地替代&lt;div&gt; 渲染此类数据。然而,由于缺乏跨浏览器支持,人们通常会避免这种技术。

    &lt;div&gt; 渲染另一方面,创建模拟数据可视化表示所需的所有形状和元素的 DOM 元素,这取决于数据的分辨率和图表的大小,可能意味着以浏览器兼容性为代价的性能影响可忽略不计或显着。

    一个中间立场是使用像 excanvas 这样的 polyfill 在大多数浏览器中提供画布支持,甚至是最新的 IE 版本。

    不过,请参阅您图书馆的文档。如果您使用库进行渲染,它们可能已经在不支持的浏览器中实现了一个 polyfill,甚至是 &lt;canvas&gt; 元素中的后备内容。

    【讨论】:

    • 你答案的最后一部分没有意义。虽然我见过一些用 div 集合和大量 CSS 创建的条形图,但 div 本身并不能绘图。在浏览器中,你会得到 canvas、SVG 或 VML(这是 excanvas 用来伪造 canvas 标签的,需要注意的是 VML 已被弃用)。
    • div 元素,结合创意背景图像和/或 CSS 属性可用于渲染折线图或饼图以及类似的基本框元素,可用于制作 Kagi 或烛台图或其他使用轴对齐的矩形。您可能无法直接绘制到 div 元素(毕竟这是 canvas 元素的设计目的),但您当然可以使用它们创建图表。
    • Nimphious,感谢您的 cmets,但是这并没有完全揭示这两个库使用的方案,这导致了我的问题。
    • 抱歉,我假设您的问题是为什么不同的库不能在不同的容器标签中工作,两个标签之间的区别是什么以及它们如何用于呈现图表。跨度>
    • 没关系。谢谢你的回答哥们。正如 Mark 所说,这取决于不同图表库的 API。有些使用&lt;div&gt;,而有些使用&lt;canvas&gt;。这就是为什么如果将它们混合在一起,图表将无法正确呈现。
    【解决方案2】:

    &lt;div&gt; 标记和&lt;canvas&gt; 标记并不是 javascript 图表的真正分界线。它真的是画布 vs SVG。 RCharts 使用画布绘制图表。 Highcharts 使用 SVG。 Highcharts 只是使用 div 作为图表的容器。这允许用户指定图表将在 DOM 中绘制的位置。同样,flot 和 jqplot(它们都使用画布来渲染它们的图)以相同的方式使用 div 标签。

    所以现在你的问题变成了画布与 SVG 进行绘图?阅读herehere

    【讨论】:

    • 感谢您的解释,这很有帮助。只提一件事,这些天我也尝试了 flot 和 jqPlot。我实际上可以在&lt;div&gt; 标签中渲染它们。所以在你的回答中说他们使用&lt;canvas&gt; 来渲染图表而不是SVG?有点困惑还是你的错字?谢谢
    • 只是用作容器。 flot 和 jqPlot 都在渲染该图表时将 标记插入到
      中。另一方面,Highcharts 在渲染时将 元素插入到
      中。
    • 再次感谢马克。但是,如果我使用 &lt;div&gt; 标签,flot 和 jqPlot 可以正确呈现图表,就像我在问题的第二个代码部分中所做的那样,但是如果我像在第一个代码部分中所做的那样更改为 &lt;canvas&gt; 标签,则不起作用在我的问题中。如果我想在&lt;canvas&gt; 中使用flot 和jqPlot,我应该修改脚本部分吗?谢谢
    • 您不能将 flot 或 jqPlot 图表渲染到画布标签。他们的两个 API 都需要一个
      。我不确定你为什么要强制它渲染 ,他们会自己添加。图表呈现后检查 html,您将看到
      ...
    • 你说得对。例如,我在绘制 5 个图时遇到了 highcharts 内存使用问题,每个图有 24 个系列,每个系列有 60 个点。不过,我会用你的数据来试一试,看看什么最适合。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签