Невозможно прочитать свойство "холст" undefined
Я пытаюсь использовать диаграммы для создания круговой диаграммы. Я выполнил шаги в документации chartjs, и я включил chart.js и элемент canvas. Я добавил script, который должен создать диаграмму в качестве примера, представленного в документации chartjs. Я получаю следующую ошибку:
Uncaught TypeError: Невозможно прочитать свойство canvas из undefined
Кто-нибудь знает, как это исправить? Что я делаю не так?
Thanx заранее!
ЗДЕСЬ КОД:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="<?php echo base_url(); ?>media/js/chart.js"></script>
<script type="text/javascript" src="<?php echo base_url(); ?>media/js/jquery.js"></script>
</head>
<canvas id="myChart" width="400" height="400"></canvas>
<script type="text/javascript">
$(function() {
options = {
//Boolean - Show a backdrop to the scale label
scaleShowLabelBackdrop: true,
//String - The colour of the label backdrop
scaleBackdropColor: "rgba(255,255,255,0.75)",
// Boolean - Whether the scale should begin at zero
scaleBeginAtZero: true,
//Number - The backdrop padding above & below the label in pixels
scaleBackdropPaddingY: 2,
//Number - The backdrop padding to the side of the label in pixels
scaleBackdropPaddingX: 2,
//Boolean - Show line for each value in the scale
scaleShowLine: true,
//Boolean - Stroke a line around each segment in the chart
segmentShowStroke: true,
//String - The colour of the stroke on each segement.
segmentStrokeColor: "#fff",
//Number - The width of the stroke value in pixels
segmentStrokeWidth: 2,
//Number - Amount of animation steps
animationSteps: 100,
//String - Animation easing effect.
animationEasing: "easeOutBounce",
//Boolean - Whether to animate the rotation of the chart
animateRotate: true,
//Boolean - Whether to animate scaling the chart from the centre
animateScale: false,
//String - A legend template
legendTemplate: "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>"
};
data = [
{
value: 300,
color: "#F7464A",
highlight: "#FF5A5E",
label: "Red"
},
{
value: 50,
color: "#46BFBD",
highlight: "#5AD3D1",
label: "Green"
},
{
value: 100,
color: "#FDB45C",
highlight: "#FFC870",
label: "Yellow"
}
];
ctx = $("#myChart").get(0).getContext("2d");
myNewChart = new Chart(ctx[0]).Pie(data, options);
});
</script>
</html>
Ответы
Ответ 1
Проблема здесь на этой строке:
myNewChart = new Chart(ctx[0]).Pie(data, options);
И в частности ctx[0]
. Когда вы определили ctx
здесь:
ctx = $("#myChart").get(0).getContext("2d");
ctx
- это объект с именем CanvasRenderingContext2D
, который обладает свойствами. Вы пытаетесь рассматривать его как массив, когда это не так. ctx[0]
поэтому undefined
. Таким образом, решение на самом деле просто, как вы выяснили.
Измените ctx[0]
на ctx
, и у вас есть хорошая анимированная круговая диаграмма.
ctx = $("#myChart").get(0).getContext("2d");
myNewChart = new Chart(ctx).Pie(data, options);
Скрипт здесь
Ответ 2
Мое решение немного отличается, поскольку я хотел динамически менять диаграмму (в моем приложении она перемещается с помощью слайдера), но избегайте ужасного мерцания.
После стандартного экземпляра я обновляю его при перемещении ползунка:
var chartData = getChartData();
for(var i=0; i<chartData.length; i++)
{
barChart.datasets[0].bars[i].value = chartData[i];
}
barChart.update();
Это анимирует, что хорошо меняются, но после завершения анимации, чтобы избежать странного мерцания, когда пользователь наводит курсор мыши (всплывающая подсказка также важна для меня), я уничтожаю и воссоздаю диаграмму на мыши следующим образом:
if(barChart) {
barChart.clear();
barChart.destroy();
}
chartDataObject = getChartData();
var chartData = {
labels: getChartLabels(),
datasets: [
{
label: "label",
fillColor: "rgba(151,187,205,0.5)",
strokeColor: "rgba(151,187,205,0.8)",
highlightFill: "rgba(151,187,205,0.75)",
highlightStroke: "rgba(151,187,205,1)",
data: chartDataObject
}
]
};
var chartContext = $("#visualizeEfficacyBar").get(0).getContext("2d");
barChart = new Chart(chartContext).Bar(chartData, { tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>", responsive : true , animate : false, animationSteps : 1 });
Важная вещь здесь не в том, чтобы оживить причину отдыха, это приводит к очень неудобному визуальному эффекту, установка animate : false
не сделала трюка, но animationSteps : 1
сделала. Теперь нет мерцания, диаграмма воссоздана, и пользователь не стал мудрее.