为什么我的条形图不显示 (Chart.js)?

Why is my bar chart not displaying (Chart.js)?

我正在尝试在单击下拉列表选项的 any 后在 ID="myChart" 的 HTML 元素中绘制条形图。我必须根据数组输入绘制 x 轴和 y 轴数据。控制台显示没有任何问题,但没有显示图表。我的下拉列表是使用 bootstrap3 创建的,图表使用 Chart.js 版本 2

现在请假设无论用户单击哪个下拉列表选项,都将绘制相同的条形图。只是不知道为什么条形图不显示。

当前HTML代码

            <div class="dropdown">
                <button class="btn btn-danger dropdown-toggle" type="button" data-toggle="dropdown">Retrieve Graph for Event 
                <span class="caret"></span></button>
                <ul class="dropdown-menu" id="generatedroplist">                      

                </ul>
            </div>
            <div>
                <canvas id="myChart" width="1" height="1"></canvas> 
            </div>

当前Javascript代码

    //====== GENERATE DROPDOWN WITH BOOTSTRAP ========================
    var edonebutton = document.getElementById("eventdonebutton");
    edonebutton.onclick = function generatedroplist() {

    $('#generatedroplist').empty();                             

    var list = document.getElementById("generatedroplist");  //when click done button then populate
        for (var h = 1; h < numberOfEvents + 1; h++){                
            var opt = "Event " + h;         
            var li = document.createElement("li");
            var link = document.createElement("a");             
            var text = document.createTextNode(opt);
            link.appendChild(text);
            //link.href = "#";
            li.appendChild(link);
            list.appendChild(li);
          }

}
      //========= CREATE BAR CHART ON CLICK OF ANY OPTION ================
            var xaxisarr = []; //global array
            var yaxisarr = []; //global array

            $('#generatedroplist li').on('click', function getgraph(){     

            xaxisarr = doublearrx[1];       //value in double array based on drop down list
            yaxisarr = doublearry[1];                               

            var ctx = document.getElementById("myChart");
            var myChart = new Chart(ctx, {
                type: 'bar',
                data: {
                    labels: xaxisarr,
                    datasets: [{
                        label: 'Workload Value',
                        data: yaxisarr,
                        backgroundColor: 
                            'rgba(244, 81, 30, 0.5)',  //change transparency here

                        borderColor: 
                            'rgba(244, 81, 30, 0.5)',

                        borderWidth: 1
                    }]
                },
                options: {
                    scales: {
                        yAxes: [{
                            ticks: {
                                beginAtZero:true
                            }
                        }]
                    }
                }
            });

        }); 

如果我在单独的 link 按钮而不是下拉列表选项上应用 onclick,图表绘制良好,如下所示。

Javascript 点击 link 按钮时的代码

    var xaxisarr = []; //global array
    var yaxisarr = [];

    var retrievegraph = document.getElementById("retrievegraph"); 

        retrievegraph.onclick = function getgraph() {

                xaxisarr = doublearrx[1]; 
                yaxisarr = doublearry[1];

                var ctx = document.getElementById("myChart");
                var myChart = new Chart(ctx, {
                    type: 'bar',
                    data: {
                        labels: xaxisarr,
                        datasets: [{
                            label: 'Workload Value',
                            data: yaxisarr,
                            backgroundColor: 
                                'rgba(244, 81, 30, 0.5)',  //change transparency here

                            borderColor: 
                                'rgba(244, 81, 30, 0.5)',

                            borderWidth: 1
                        }]
                    },
                    options: {
                        scales: {
                            yAxes: [{
                                ticks: {
                                    beginAtZero:true
                                }
                            }]
                        }
                    }
                });

        }

这就是它不起作用的原因。由于您正在向下拉列表中动态添加元素,因此您必须仅在完成后附加您的点击事件。

在您当前的代码中,您将点击处理程序绑定到所有下拉元素(但 none 还存在...或者即使某些确实存在,您稍后会在执行 $('#generatedroplist').empty() 然后正在添加新的)。一旦删除这些 DOM 元素,之前绑定的处理程序将不再起作用。

解决方法很简单。只需将下拉单击绑定函数包装在另一个函数中,您可以在动态创建下拉项后调用该函数。

var edonebutton = document.getElementById("eventdonebutton");

edonebutton.onclick = function generatedroplist() {
  $('#generatedroplist').empty();

  var list = document.getElementById("generatedroplist"); //when click done button then populate
  for (var h = 1; h < numberOfEvents + 1; h++) {
    var opt = "Event " + h;
    var li = document.createElement("li");
    var link = document.createElement("a");
    var text = document.createTextNode(opt);
    link.appendChild(text);
    link.href = "#";
    li.appendChild(link);
    list.appendChild(li);
  }

  bindClickEvent();
};

var bindClickEvent = function() {
  $('#generatedroplist li').click(function(e) {
    var ctx = document.getElementById("myChart");
    var myChart = new Chart(ctx, {
      type: 'bar',
      data: {
        labels: labels,
        datasets: [{
          label: 'Workload Value',
          data: data,
          backgroundColor: 'rgba(244, 81, 30, 0.5)',
            //change transparency here
          borderColor: 'rgba(244, 81, 30, 0.5)',
          borderWidth: 1
        }]
      },
      options: {
        scales: {
          yAxes: [{
            ticks: {
              beginAtZero: true
            }
          }]
        }
      }
    });
  });
}

这是一个 codepen 演示。