代码之家  ›  专栏  ›  技术社区  ›  Michelle

使chartjs重新渲染一次

  •  0
  • Michelle  · 技术社区  · 7 年前

    我有几张图表(已完成)图表.js)当它们在视窗里的时候就可以给它们设置动画。在下面的代码中,fullyVisible()用于检查图表是否在视口中,如果在视口中,则重新渲染它。问题是,使用这段代码,图表会随着每个卷轴不断地重新渲染,直到完全脱离视口。我的问题是是否有可能只渲染一次图表。

    $(window).on("resize scroll", function(){ 
      if ($('#myChart').fullyVisible()) {
        chart = new Chart(ctx, config); 
        chart.render();
       };    
    
      if ($('#myChart1').fullyVisible()) {
        chart1 = new Chart(ctx1, config1); 
        chart1.render();
       }; 
    });
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   insertusernamehere    7 年前

    可以使用布尔标志:

    let isRendered = false;
    

    if (!isRendered && $('#myChart').isFullyVisible()) {
        chart = new Chart(ctx, config); 
        chart.render();
    
        isRendered = !isRendered;
    }
    
    if (isRendered && $('#myChart').isOutOfView()) {
        chart.destroy();
        chart = null;
    
        isRendered = !isRendered;
    }
    

    或者你可以检查一下 chart 存在:

    let chart = null;
    
    if (!chart && $('#myChart').isFullyVisible()) {
       chart = new Chart(ctx, config); 
       chart.render();
    }
    
    if (chart && $('#myChart').isOutOfView()) {
        chart.destroy();
        chart = null;
    }
    

    所有的测试只有在需要的时候才会启动昂贵的可见性测试。


    作为补充说明,最好缓存选择器,这样就不需要在每次滚动/调整大小事件中重新查询它们:

    const chartCanvas = $('#chart');
    
    $(window).on('resize scroll', function☮ { 
        if (chartCanvas.fullyVisible()) {}
    });