chart.js 工具提示在更新后不断记住旧数据
chart.js tooltip keeps remembering old data after update
我用 chart.js 显示了一个图表,当用户将鼠标悬停在它上面时,会显示一个工具提示。这很好用。
但是,我想添加用户可以取消检查数据点的选项。我做到了,这是正确的,但工具提示功能会记住新旧数据。因此,如果您将鼠标悬停在图表上,它会在新旧图表之间闪烁。
当我制作自定义工具提示并放置一个 console.log 数据对象时,我可以看到它只是加载了几个数据对象。
有没有办法确保旧数据真正被遗忘?
查看 fiddle https://jsfiddle.net/CorneelDragon/s0udzwv3/27/ 或查看下面的代码(它在开始时有效,但当您取消选中某些内容时,工具提示会使其变得不稳定):
<script
src='https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.min.js'></script>`
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>`
<div id="slct2">"beh"</div>
<table id="table1" border=1></table>
<!-- bar chart canvas element -->
<canvas id="myChart" width="200" height="50"></canvas>
<script type="text/javascript">
</script>
和 javascript:
test_labels = ["meh", "beh", "yeh"]
score = [4,3.8,5]
var s2 = document.getElementById("slct2");
s2.innerHTML = "";
for (var test in test_labels) {
if (test_labels.hasOwnProperty(test)) {
var pair = test_labels[test] + score[test];
var checkbox = document.createElement("input");
checkbox.type = "checkbox";
checkbox.name = "test_filter";
checkbox.value = pair;
checkbox.checked = true;
s2.appendChild(checkbox);
var label = document.createElement('label');
label.htmlFor = pair;
label.appendChild(document.createTextNode(pair));
s2.appendChild(label);
s2.appendChild(document.createElement("br"));
}
}
function fillCanvas (test_labels, score) {
var ctx = document.getElementById("myChart").getContext('2d');
ctx.innerHTML = "";
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels : ["test_month"]
},
});
setTimeout(function () {
for (test in test_labels){
myChart.data.datasets.push({
backgroundColor: 'rgb(228,26,28)',
label: test_labels[test],
data: [score[test]]
});
}
myChart.update();
}, 1000);
}
fillCanvas(test_labels, score);
var filter_magic = function(e) {
test_selected = []
var table1 = document.getElementById("table1");
table1.innerHTML = "";
jQuery('input[type="checkbox"][name="test_filter"]').each(function() {
if (jQuery(this).is(':checked')) {
var tr = document.createElement('tr');
tr.innerHTML = this.value;
table1.appendChild(tr);
test_selected.push(this.value);
}
})
fillCanvas(test_selected, score);
}
jQuery('input[type="checkbox"][name="test_filter"]').on('change', filter_magic);
filter_magic();
这不是更新图表的正确方法,在您的代码中,每次更新图表时,您也在创建图表的新实例,而不会破坏之前的实例,这就是为什么您可以看到悬停时的旧值。
一个解决方案是,如果您想每次都创建一个新图表,然后将图表存储在全局变量中,并且每当切换复选框时,然后检查图表是否存储在变量中,销毁它然后创建一个新图表.
参见下面的代码或fiddle -> https://jsfiddle.net/s0udzwv3/31/
test_labels = ["meh", "beh", "yeh"]
score = [4,3.8,5]
var s2 = document.getElementById("slct2");
s2.innerHTML = "";
for (var test in test_labels) {
if (test_labels.hasOwnProperty(test)) {
var pair = test_labels[test] + score[test];
var checkbox = document.createElement("input");
checkbox.type = "checkbox";
checkbox.name = "test_filter";
checkbox.value = pair;
checkbox.checked = true;
s2.appendChild(checkbox);
var label = document.createElement('label');
label.htmlFor = pair;
label.appendChild(document.createTextNode(pair));
s2.appendChild(label);
s2.appendChild(document.createElement("br"));
}
}
var myChart;
function fillCanvas (test_labels, score) {
var ctx = document.getElementById("myChart").getContext('2d');
ctx.innerHTML = "";
if(myChart)
{
myChart.destroy();
}
myChart = new Chart(ctx, {
type: 'bar',
data: {
labels : ["test_month"]
},
});
setTimeout(function () {
for (test in test_labels){
myChart.data.datasets.push({
backgroundColor: 'rgb(228,26,28)',
label: test_labels[test],
data: [score[test]]
});
}
myChart.update();
}, 1000);
}
fillCanvas(test_labels, score);
var filter_magic = function(e) {
test_selected = []
var table1 = document.getElementById("table1");
table1.innerHTML = "";
jQuery('input[type="checkbox"][name="test_filter"]').each(function() {
if (jQuery(this).is(':checked')) {
var tr = document.createElement('tr');
tr.innerHTML = this.value;
table1.appendChild(tr);
test_selected.push(this.value);
}
})
fillCanvas(test_selected, score);
}
jQuery('input[type="checkbox"][name="test_filter"]').on('change', filter_magic);
filter_magic();
另一种推荐的方法是使用 new Chart
仅加载一次图表,每次切换复选框时只需推送新数据集并调用存储在全局变量中的 chart.update() 方法.
我用 chart.js 显示了一个图表,当用户将鼠标悬停在它上面时,会显示一个工具提示。这很好用。
但是,我想添加用户可以取消检查数据点的选项。我做到了,这是正确的,但工具提示功能会记住新旧数据。因此,如果您将鼠标悬停在图表上,它会在新旧图表之间闪烁。
当我制作自定义工具提示并放置一个 console.log 数据对象时,我可以看到它只是加载了几个数据对象。
有没有办法确保旧数据真正被遗忘?
查看 fiddle https://jsfiddle.net/CorneelDragon/s0udzwv3/27/ 或查看下面的代码(它在开始时有效,但当您取消选中某些内容时,工具提示会使其变得不稳定):
<script
src='https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.min.js'></script>`
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>`
<div id="slct2">"beh"</div>
<table id="table1" border=1></table>
<!-- bar chart canvas element -->
<canvas id="myChart" width="200" height="50"></canvas>
<script type="text/javascript">
</script>
和 javascript:
test_labels = ["meh", "beh", "yeh"]
score = [4,3.8,5]
var s2 = document.getElementById("slct2");
s2.innerHTML = "";
for (var test in test_labels) {
if (test_labels.hasOwnProperty(test)) {
var pair = test_labels[test] + score[test];
var checkbox = document.createElement("input");
checkbox.type = "checkbox";
checkbox.name = "test_filter";
checkbox.value = pair;
checkbox.checked = true;
s2.appendChild(checkbox);
var label = document.createElement('label');
label.htmlFor = pair;
label.appendChild(document.createTextNode(pair));
s2.appendChild(label);
s2.appendChild(document.createElement("br"));
}
}
function fillCanvas (test_labels, score) {
var ctx = document.getElementById("myChart").getContext('2d');
ctx.innerHTML = "";
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels : ["test_month"]
},
});
setTimeout(function () {
for (test in test_labels){
myChart.data.datasets.push({
backgroundColor: 'rgb(228,26,28)',
label: test_labels[test],
data: [score[test]]
});
}
myChart.update();
}, 1000);
}
fillCanvas(test_labels, score);
var filter_magic = function(e) {
test_selected = []
var table1 = document.getElementById("table1");
table1.innerHTML = "";
jQuery('input[type="checkbox"][name="test_filter"]').each(function() {
if (jQuery(this).is(':checked')) {
var tr = document.createElement('tr');
tr.innerHTML = this.value;
table1.appendChild(tr);
test_selected.push(this.value);
}
})
fillCanvas(test_selected, score);
}
jQuery('input[type="checkbox"][name="test_filter"]').on('change', filter_magic);
filter_magic();
这不是更新图表的正确方法,在您的代码中,每次更新图表时,您也在创建图表的新实例,而不会破坏之前的实例,这就是为什么您可以看到悬停时的旧值。
一个解决方案是,如果您想每次都创建一个新图表,然后将图表存储在全局变量中,并且每当切换复选框时,然后检查图表是否存储在变量中,销毁它然后创建一个新图表.
参见下面的代码或fiddle -> https://jsfiddle.net/s0udzwv3/31/
test_labels = ["meh", "beh", "yeh"]
score = [4,3.8,5]
var s2 = document.getElementById("slct2");
s2.innerHTML = "";
for (var test in test_labels) {
if (test_labels.hasOwnProperty(test)) {
var pair = test_labels[test] + score[test];
var checkbox = document.createElement("input");
checkbox.type = "checkbox";
checkbox.name = "test_filter";
checkbox.value = pair;
checkbox.checked = true;
s2.appendChild(checkbox);
var label = document.createElement('label');
label.htmlFor = pair;
label.appendChild(document.createTextNode(pair));
s2.appendChild(label);
s2.appendChild(document.createElement("br"));
}
}
var myChart;
function fillCanvas (test_labels, score) {
var ctx = document.getElementById("myChart").getContext('2d');
ctx.innerHTML = "";
if(myChart)
{
myChart.destroy();
}
myChart = new Chart(ctx, {
type: 'bar',
data: {
labels : ["test_month"]
},
});
setTimeout(function () {
for (test in test_labels){
myChart.data.datasets.push({
backgroundColor: 'rgb(228,26,28)',
label: test_labels[test],
data: [score[test]]
});
}
myChart.update();
}, 1000);
}
fillCanvas(test_labels, score);
var filter_magic = function(e) {
test_selected = []
var table1 = document.getElementById("table1");
table1.innerHTML = "";
jQuery('input[type="checkbox"][name="test_filter"]').each(function() {
if (jQuery(this).is(':checked')) {
var tr = document.createElement('tr');
tr.innerHTML = this.value;
table1.appendChild(tr);
test_selected.push(this.value);
}
})
fillCanvas(test_selected, score);
}
jQuery('input[type="checkbox"][name="test_filter"]').on('change', filter_magic);
filter_magic();
另一种推荐的方法是使用 new Chart
仅加载一次图表,每次切换复选框时只需推送新数据集并调用存储在全局变量中的 chart.update() 方法.