为什么我的条形图不显示 (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 演示。
我正在尝试在单击下拉列表选项的 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 演示。