【问题标题】:Flot chart loading animation while rendering渲染时浮动图表加载动画
【发布时间】:2013-07-17 11:11:43
【问题描述】:

我正在尝试实现某种动画,同时使用 Flot 图表呈现大图。我尝试了许多解决方案,但都失败了。有谁知道这是否可能,以便用户可以看到正在渲染的图表。

我尝试使用带有加载 gif 的叠加层,但 gif 直到图形停止渲染后才会动画。

代码被问了很多,但我想确保用户可以看到进度。

提前致谢

【问题讨论】:

  • 根据您的描述,我假设 flot 使用 UI 线程来呈现图形,因此页面将保持冻结状态,直到图形被呈现。调整它以使用网络工作者可能不值得麻烦。
  • 我使用动画 gif 向用户展示正在加载的图形数据。我不知道您是如何获取数据的,但我使用了 ajax 调用,它工作正常。
  • @FabrícioMatté - 对于足够大的图表可能是值得的。我在慢速机器上看到过这样的情况,其中一个相当简单的图表需要 10 多秒才能加载,同时完全冻结 UI
  • 好的,没想到这一点...您将无法访问网络工作者中的画布元素,因此这不可行
  • 是的,worker 无权访问 DOM。我经常看到这种缓慢的浮点渲染问题,也许值得在flot repo 上请求渲染增强。

标签: javascript jquery flot


【解决方案1】:

Flot 在 UI 线程上一次性渲染整个绘图。如果不修改库本身,就无法显示进度。一个完美的解决方案需要大量工作,但根据您的数据,一个合适的近似值可能不需要太多努力。

例如,假设您的情节包含许多系列,并且每个系列本身的渲染速度都非常快,但它们加在一起需要很长时间。在这种情况下,如果您打开 Flot 源并查找 draw 函数,您会看到每个系列都有一个简单的循环调用 drawSeries:

function draw() {

    CODE BLOCK A

    for (var i = 0; i < series.length; ++i) {
        executeHooks(hooks.drawSeries, [ctx, series[i]]);
        drawSeries(series[i]);
    }

    CODE BLOCK B
}

将其替换为(大致;尚未测试)以下内容:

function draw() {

    CODE BLOCK A

    var i = 0,
        drawNextSeries = function() {
            drawSeries(series[i]);
            if (++i < series.length) {
                setTimeout(drawNextSeries, 0);
            } else {
                CODE BLOCK B
            }
        };

    setTimeout(drawNextSeries, 0);
}

这个想法是通过 setTimeout 在单独的调用中绘制每个系列。零毫秒延迟会在任何待处理的工作(如其他 JS 代码、动画等)之后将调用排队运行。因此,在每个系列绘制之后,UI 有机会在下一个绘制之前更新。

同样,这仅适用于您有许多系列且每个系列都绘制得相当快的情况。如果你只有一个大系列,你最终还是会做类似的事情,但在 drawSeries 中。

【讨论】:

  • 很好的建议,但无法实现。你有例子吗?
  • 什么是代码块a和代码块b你能把完整的代码放在我试图实现失败的地方
  • 打开 jquery.flot.js 并查找 draw 函数以查看这些块是什么。同样,这并不是要复制粘贴代码。这只是一般方法;您需要完成针对您的特定案例的实施。
猜你喜欢
  • 2021-06-04
  • 2017-08-08
  • 2012-08-15
  • 2015-03-24
  • 2018-01-27
  • 2020-06-01
  • 2018-08-07
  • 2019-03-24
  • 2020-08-19
相关资源
最近更新 更多