【问题标题】:ChartJs line chart repaint glitch while hovering overChartJs 折线图在悬停时重新绘制故障
【发布时间】:2015-07-15 12:09:16
【问题描述】:

我有以下利用 ChartJS 库的代码。

/*assume the tags in the right place */

<canvas id="graph1" width="300" height="300"></canvas>

var ctx = $("#graph1").get(0).getContext("2d");
var myChart = new Chart(ctx).Line(graph1Generator("day"));

...一切正常,但是在添加以下事件处理程序以使用不同数据清除和重新绘制相同图表后,出现故障。

weekButton.addEventListener("click", function(){
    ctx.clearRect (0, 0, 300, 300);
    ctx.canvas.width = 300;
    ctx.canvas.height = 300;
    myChart = new Chart(ctx).Line(graph1Generator("week"));

这段代码确实成功地用新数据重新绘制了图表,但是当我将鼠标悬停在它上面时,它会对应该清除的旧图表进行一些非常奇怪的“闪回”。这让我相信它没有清除旧的。

【问题讨论】:

  • 我认为如果您只是重新使用旧图表对象而不是在事件处理程序中创建一个新对象,它会起作用。作为替代方案,您也可以在创建新之前致电myChart.destroy();。
  • 如何将旧图表对象与新数据重用?虽然图表相同,但它们具有不同类型的数据。此外,myChar.destroy(); 似乎在每次活动后都会复制我的图表大小。为什么会这样?
  • 我认为只是myChart.Line(graph1generator("week"));(或者您需要为新数据做的任何事情)。而不是用你的代码清除画布,让 Chart 来做:myChart.clear();。 (这可能比.destroy() 更有效;我不确定。)
  • 虽然 myChart.clear() 不会复制大小,但它仍然无法解决故障。此外,当更改myChart.Line(graph1generator("week")); 之类的对象时,我得到一个ReferenceError: Can't find variable: graph1generator 。这很奇怪,因为它的一个函数在上面定义了 1 个作用域(全局作用域)。
  • 没有看到更多代码很难知道发生了什么。您是否尝试过在 jsfiddle 或 CodePen 中复制问题?

标签: javascript jquery charts chart.js


【解决方案1】:

Here is an update to your fiddle.主要的变化(除了修复函数名拼写错误)是添加

myChart.destroy();

在行之前

myChart = new Chart(ctx).Line(...);

.destroy() 方法摆脱了事件处理程序注册等,因此当您将鼠标悬停在图形上时,您不应该看到那些奇怪的“鬼图”。

【讨论】:

  • 您的 jsfiddle 有效,但有一个奇怪的副作用。在小提琴上,在每个事件处理程序运行后,另一个画布的大小开始呈指数增长。在我的页面上(在 safari 中测试),折线图似乎只是呈指数级增长。我正在运行您的确切代码,有没有办法避免这种情况发生?
  • @ApathyBear 我运行它时没有看到任何变大的东西。您也可以为其他图表添加.destroy() 调用,但是当我尝试时这并没有太大区别。
  • @ApathyBear 我已经尝试过 Firefox 和 Chrome,但饼图和甜甜圈图都不会改变大小。
  • 谢谢。这对我来说一定是独一无二的。我真的很感谢所有的帮助。我以为我疯了!
  • 作为参考,这是我在足够的点击后看到的。 app.box.com/s/5vy4nhl37eyyprnjems0hkgc5mj96n0h,不知道为什么。很奇怪。
猜你喜欢
  • 2020-02-02
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 2018-04-04
相关资源
最近更新 更多