仅在调用时运行方法(JavaScript)

时间:2015-05-09 09:01:15

标签: javascript jquery canvas

有什么问题?

我遇到的问题是,当我浏览不同的图表时(仅当我导航时),图表变得越来越慢..有内存泄漏,我无法弄清楚如何解决问题,所以我想向你们展示负责显示图表的JQuery事件代码,以及5个图表中的内容。

我真正想要的是,用户可以在没有任何性能降低的情况下自由导航,请我需要帮助,我已经在这个代码工作了6天了,我现在问题可以解决了!

我想要实现的目标是什么?

我希望用户有机会自由浏览五个图表,请记住,用户一次只能查看一个图表。在左侧有一个列表,用户必须单击该列表才能查看图表,右侧是图表的显示位置。 (每个图表都是动态的)。

Diagram1.js:我有4个其他图表具有相同的代码结构但值不同。

(function (){

        var dps1 = []; 

        var chart = new CanvasJS.Chart("table1",
        { 
          title:{
            text: "This is Diagram 1"  
          },      
          data: [
          {        
            type: "spline",
            name: "Temp Cylinder 1",
            dataPoints: dps1
          }
        });

        var xVal = 0;
        var yVal = 100;  
        var updateInterval = 50; 
        var dataLength = 50; 

    var updateChart = function (count) {
            count = count || 1;
            // count is number of times loop runs to generate random dataPoints.
            for (var j = 0; j < count; j++) {
                yVal = yVal +  Math.round(5 + Math.random() *(-5-5));  
                dps1.push({
                    x: xVal,
                    y: yVal       
                });
                xVal++;
            };  
            if (dps1.length > dataLength )
            {
                dps1.shift();             
            }    
            chart.render();     
        };

        // generates first set of dataPoints
        updateChart(dataLength); 
        // update chart after specified time. 
        setInterval(function(){updateChart()}, updateInterval); 
}()); 

list.JS:负责在每次点击后显示图表。 var pres_row如果没有这个,当用户多次点击同一行时,图表会变慢..

    var pres_row = 0; // Only one click

    $('[data-row]').on('click', function() {
         var row = $(this).attr('data-row');
         $('.active').removeClass('active');
         $('#table' + row).addClass('active'); 

             if(row == 1 && pres_row != 1){
                pres_row = 1
                $.getScript("diagram1.js");
             } else if (row == 2 && pres_row != 2) {
                pres_row = 2;
                $.getScript("diagram2.js"); 
             } else if (row == 3 && pres_row != 3) {
                pres_row = 3;
                $.getScript("diagram3.js"); 
             } else if (row == 4 && pres_row != 4) {
                pres_row = 4;
                $.getScript("diagram4.js");
             }else if (row == 5 && pres_row != 5) {
                pres_row = 5;
                $.getScript("diagram5.js");
             }

2 个答案:

答案 0 :(得分:1)

正如@Nit所说,你是一次又一次地将你的脚本文件加载到页面中,使得无数间隔运行而不进行清理。

你需要采用一些策略,a)只有在先前尚未加载的情况下加载diagramX.js并且b)有办法在为当前的一个开始之前清除已经运动的任何间隔。

示例:您可以在每个diagram1.js中定义函数,如:

// global interval handle
var diagramInterval1 = false;

// make it named, so you can check if it is already loaded
function diagram1() {
    ...
    diagramInterval1 = setInterval(updateChart, updateInterval); 
}

在list.js中,用于加载:

if(row !== pres_row){

    // clear the currently running interval if any
    if('diagramInterval' + pres_row in window) {
        clearInterval(window['diagramInterval' + pres_row]);
    }

    pres_row = row;

    // load only if not loaded
    if('diagram' + pres_row in window) {
        window['diagram' + pres_row]();
    }
    else {
        $.getScript("diagram" + pres_row + ".js", function() {
            window['diagram' + pres_row]();
        });
    }

}

答案 1 :(得分:0)

@techfoobar,你的意思是在diagram1.js里面这样吗

(function (){

        var dps1 = []; 

        var chart = new CanvasJS.Chart("table1",
        { 
          title:{
            text: "This is Diagram 1"  
          },      
          data: [
          {        
            type: "spline",
            name: "Temp Cylinder 1",
            dataPoints: dps1
          }
        });

        var xVal = 0;
        var yVal = 100;  
        var updateInterval = 50; 
        var dataLength = 50; 

    var updateChart = function (count) {
            count = count || 1;
            // count is number of times loop runs to generate random dataPoints.
            for (var j = 0; j < count; j++) {
                yVal = yVal +  Math.round(5 + Math.random() *(-5-5));  
                dps1.push({
                    x: xVal,
                    y: yVal       
                });
                xVal++;
            };  
            if (dps1.length > dataLength )
            {
                dps1.shift();             
            }    
            chart.render();     
        };

// global interval handle
var diagramInterval1 = false;

// make it named, so you can check if it is already loaded
function diagram1() {
    ...
    diagramInterval1 = setInterval(updateChart, updateInterval); 
} 
}());