inview.jsを使用してchart.jsを1ページに複数実装する

皆さん、こんにちは!
今回は、タイトルの通りinviewを使用して、ウィンドウ表示領域内に入ったら
chart.jsを動かしつつ、1ページに複数chart.jsを実装する方法をご紹介します。

では早速実装方法から!

まずはCDNでもダウンロードして導入でもどちらでもOKなので

①通常のjQuery
②inview.js
③chart.js
④chart.css
の順に読み込みを行います。
1つでも欠ければうまくいかないので気を付けてくださいね!

<script src="//code.jquery.com/jquery-3.5.1.js"></script> 
<script src="/arch4/js/jquery.inview.min.js"></script>	
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.css">

chart.jsを表示させたい箇所に下記を記述します。(IDは任意でOK)

<canvas id="myLineChart"></canvas> //折れ線グラフ
<canvas id="mybarChart"></canvas> //帯グラフ

早速JSを記述します。
まずはinview.jsとchart.jsの単純な組み合わせのソースを記載します。
chartが1つの場合。

$(function () {
        $('#myLineChart').on('inview', function (event, isInView, visiblePartX, visiblePartY) {//折れ線グラフまたは帯グラフのID指定
            if (isInView) {
                var ctx1 = document.getElementById("myLineChart"); //折れ線グラフまたは帯グラフのID指定
                if (ctx1) {
                    var myLineChart = new Chart(ctx1, {
                        type: 'line', //折れ線グラフの場合はline、帯の場合はbarを指定
                        data: {
                          //ここに中身を記載
                        }
                    });
                }
            }
        });
});

chart.jsが2つの場合は下記のようになります。

$(function () {
        $('#myLineChart').on('inview', function (event, isInView, visiblePartX, visiblePartY) {//折れ線グラフまたは帯グラフのID指定
            if (isInView) {
                var ctx1 = document.getElementById("myLineChart"); //折れ線グラフまたは帯グラフのID指定
                if (ctx1) {
                    var myLineChart = new Chart(ctx1, {
                        type: 'line', //折れ線グラフの場合はline、帯の場合はbarを指定
                        data: {
                          //ここに中身を記載
                        }
                    });
                }
            }
        });
        $('#mybarChart').on('inview', function (event, isInView, visiblePartX, visiblePartY) {//折れ線グラフまたは帯グラフのID指定
            if (isInView) {
                var ctx2 = document.getElementById("mybarChart"); //折れ線グラフまたは帯グラフのID指定
                if (ctx2) {
                    var myLineChart = new Chart(ctx1, {
                        type: 'bar', //折れ線グラフの場合はline、帯の場合はbarを指定
                        data: {
                          //ここに中身を記載
                        }
                    });
                }
            }
        });
});

ここで重要なのが下記の記述部分。

        var ctx1 = document.getElementById("myLineChart"); //折れ線グラフまたは帯グラフのID指定
        if (ctx1) { }

このctx(なんでもよいのですが)数を必ず増やしてあげるなり、特定のvarをしっかりつけてあげてください。
じゃないとグラフが一つだけ表示されて、2つ目が表示されなくなったりします。

具体的に実装すると下記のような感じ。

$(function () {
        $('#myLineChart').on('inview', function (event, isInView, visiblePartX, visiblePartY) {
            if (isInView) {
                var ctx1 = document.getElementById("myLineChart");
                if (ctx1) {
                    var myLineChart = new Chart(ctx1, {
                        type: 'line',
                        data: {
                            labels: ['A', 'B', 'C'],
                            datasets: [
                                {
                                    label: 'テスト1',
                                    data: [64, 68, 84],
                                    borderColor: "rgba(168, 176, 219,1)",
                                    backgroundColor: "rgba(0,0,0,0)",
                                    fill: false,
                                    lineTension: 0,
                                },
                                {
                                    label: 'テスト2',
                                    data: [57, 64, 75],
                                    borderColor: "rgba(229, 181, 186,1)",
                                    backgroundColor: "rgba(0,0,0,0)",
                                    fill: false,
                                    lineTension: 0,
                                },
                                {
                                    label: 'テスト3',
                                    data: [50, 58, 67],
                                    borderColor: "rgba(231, 208, 183,1)",
                                    backgroundColor: "rgba(0,0,0,0)",
                                    fill: false,
                                    lineTension: 0,
                                },
                                {
                                    label: 'テスト4',
                                    data: [9, 29, 69],
                                    borderColor: "rgba(229, 225, 203,1)",
                                    backgroundColor: "rgba(0,0,0,0)",
                                    fill: false,
                                    lineTension: 0,
                                },
                                {
                                    label: 'テスト5',
                                    data: [44, 48, 62],
                                    borderColor: "rgba(188, 217, 166,1)",
                                    backgroundColor: "rgba(0,0,0,0)",
                                    fill: false,
                                },
                                {
                                    label: 'テスト6',
                                    data: [35, 45, 59],
                                    borderColor: "rgba(155, 205, 170,1)",
                                    backgroundColor: "rgba(0,0,0,0)",
                                    fill: false,
                                    lineTension: 0,
                                },
                                {
                                    label: 'テスト7',
                                    data: [24, 32, 46],
                                    borderColor: "rgba(168, 176, 219,1)",
                                    backgroundColor: "rgba(0,0,0,0)",
                                    fill: false,
                                    lineTension: 0,
                                },
                            ],
                        },
                        options: {
                            title: {
                                display: true,
                                fontSize: 18,
                                text: 'テスト値に対する数位'
                            },
                            legend: {
                                // 右上に配置
                                align: 'start',
                                position: 'right',
                                // 余白
                                labels: {
                                    padding: 15
                                }
                            },
                            scales: {
                                yAxes: [{
                                    ticks: {
                                        suggestedMax: 90,
                                        suggestedMin: 0,
                                        stepSize: 10,
                                        fontSize: 16,
                                        callback: function (value, index, values) {
                                            return value + '%'
                                        }
                                    },
                                    scaleLabel: {
                                        display: true,
                                        labelString: '← 低 テスト改善率 高 →',
                                        fontColor: '#333',
                                        fontSize: 16,
                                    },
                                }],
                                xAxes: [{
                                    ticks: {
                                        fontSize: 16,
                                    },
                                    scaleLabel: {
                                        display: true,
                                        labelString: '← 低 テストグレード 高 →',
                                        fontColor: '#333',
                                        fontSize: 16,
                                    },
                                }]
                            },
                        }
                    });
                }
            }
        });


        $('#myChart').on('inview', function (event, isInView, visiblePartX, visiblePartY) {
            if (isInView) {
                var ctx2 = document.getElementById("mybarChart");
                if (ctx2) {
                    var myChart = new Chart(ctx2, {
                        type: 'bar',
                        data: {
                            labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
                            datasets: [
                                {
                                    label: 'シュミレーションの電気代',
                                    data: [20000, 20000, 18000, 14000, 11000, 11000, 14000, 17000, 13500, 12000, 14000, 17000],
                                    backgroundColor: "rgba(219,39,91,0.5)"
                                },
                                {
                                    label: '実際の電気代',
                                    data: [17000, 16000, 9000, 13700, 10800, 7000, 9000, 13700, 14000, 12000, 9900, 11000],
                                    backgroundColor: "rgba(130,201,169,0.5)"
                                }
                            ]
                        },
                        options: {

                            title: {
                                display: false,
                                text: 'シュミレーションと実際の電気代の比較'
                            },
                            tooltips: {
                                enabled: false
                            },
                            animation: {
                                duration: 1000,
                                easing: 'linear',
                                from: 1,
                                to: 0,
                                loop: true
                            },
                            scales: {
                                yAxes: [{
                                    ticks: {
                                        suggestedMax: 25000,
                                        suggestedMin: 0,
                                        stepSize: 5000,
                                        callback: function (value, index, values) {
                                            return "¥" + value
                                        }
                                    }
                                }]
                            },
                        }
                    });
                }
            }
        });

    });

同じようなことでつまずいている人の参考になれば幸いです。
それでは!