#javascript #php #canvas #canvasjs
#javascript #php #холст #canvasjs
Вопрос:
function timeDataToPointChart($dataPoints,$title,$xlabel,$ylabel,$chartID) {
?>
<script src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
<script>
window.onload = function () {
var NameOfChart = "<?php echo $chartID; ?>"
window[NameOfChart] = new CanvasJS.Chart("chartContainer",
{
animationEnabled: true,
title:{
text: "<?php echo $title; ?>"
},
axisX:{
title: "<?php echo $xlabel; ?>",
valueFormatString: "MM/YYYY",
crosshair: {
enabled: true
}
},
axisY: {
title: "<?php echo $ylabel; ?>"
},
data: [
{
type: "line",
xValueType: "dateTime",
dataPoints:
<?php echo json_encode($dataPoints, JSON_NUMERIC_CHECK); ?>
}
]
});
window[NameOfChart].render();
function toggleDataSeries(e){
if (typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible) {
e.dataSeries.visible = false;
}
else{
e.dataSeries.visible = true;
}
window[NameOfChart].render();
}
}
</script>
<div id="chartContainer" style="height: 370px; width: 650px;"></div>
<?php
}
?>
Я использую эту функцию PHP для создания моей диаграммы canvas. Это работает хорошо, но если я вызываю функцию дважды на странице, отображается только одна диаграмма.
Консоль показывает следующую ошибку, но я не понимаю, что не так.
Пространство имен CanvasJS уже существует. Если вы загружаете как скрипты диаграммы, так и stockchart, просто загрузите stockchart отдельно, поскольку он включает в себя все функции диаграммы.
Спасибо за вашу помощь.
Комментарии:
1. Не используйте
window.onload
. Заставьте PHP сгенерировать весь файл (напримерmyscript.php
, ), убедившись, что он устанавливает заголовок content-type в JS mimetype, а затем загрузите его как script using<script src="myscript.php" type="text/javascript" async defer>
, где важной частью является этоdefer
ключевое слово: отложенные скрипты запускаются только после готовности браузера. Не заставляйте PHP генерировать встроенный JS, если вам не нужна именно такая ситуация, когда вы даже не можете сказать, связана ли проблема с поведением на стороне сервера или клиента.
Ответ №1:
Как описано в CanvasJS, я соответствующим образом реализовал код в своем приложении Laravel, как показано ниже
@foreach($records as $record)
<div id="chartContainer{{$record->employeeRequisitionId}}" style="height: 270px; width: 100%;"></div>
@endforeach
@push('after_scripts')
<script>
window.onload = function () {
@foreach($records as $record)
const chart{{$record->employeeRequisitionId}} = new CanvasJS.Chart ( "chartContainer{{$record->employeeRequisitionId}}", {
animationEnabled: true,
theme: "light2",
title: {
text: "Requisition According Fiscal Year"
},
axisY: {
suffix: "%",
scaleBreaks: {
autoCalculate: false
}
},
data: [{
type: "column",
yValueFormatString: "#,##0"%"",
indexLabel: "{y}",
indexLabelPlacement: "inside",
indexLabelFontColor: "white",
dataPoints: {!! formatRequisitionAccordingFiscalYearData($record) !!}
}]
} );
@endforeach
@foreach($records as $record)
chart{{$record->employeeRequisitionId}}.render ();
@endforeach
}
</script>
@endpush