为什么canvas内容line chart chart.js没有显示在bootstrap popover body上?

d8tt03nd  于 2023-04-06  发布在  Chart.js
关注(0)|答案(1)|浏览(130)

我试图在bootstrap按钮上创建bootstrap popover,其内容是折线图chart.js。然而,当我单击按钮时,popover显示我提供的所有内容,但不是折线图。请注意,我设置html true,以便popover可以接受HTML内容。
我已经尝试了从chart.js的recommedations(辅助功能部分),引导弹出框.但我仍然没有工作.我通过在弹出框中添加文本内容进行测试,它工作坚果不工作折线图.这里是我的代码.感谢大家花时间阅读我的问题.

<!DOCTYPE html>
<html lang="en">

<head>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-aFq/bzH65dt+w6FI2ooMVUpc+21e0SRygnTpmBvdBgSdnuTN7QbdgL+OapgHtvPp" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha2/dist/js/bootstrap.bundle.min.js" integrity="sha384-qKXV1j0HvMUeCBQ+QVp7JcfGl760yU08IQ+GpUo5hlbpg51QRiuqHAJz8+BrxE/N" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.7.0/chart.min.js" integrity="sha512-TW5s0IT/IppJtu76UbysrBH9Hy/5X41OTAbQuffZFU6lQ1rdcLHzpU5BzVvr/YFykoiMYZVWlr/PX1mDcfM9Qg==" crossorigin="anonymous"></script>
    <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.0.1/chart.min.js" integrity="sha512-tQYZBKe34uzoeOjY9jr3MX7R/mo7n25vnqbnrkskGr4D6YOoPYSpyafUAzQVjV6xAozAqUFIEFsCO4z8mnVBXA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous"></script> -->
    <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
    <!-- <script src='https://kendo.cdn.telerik.com/2016.2.714/js/kendo.all.min.js'></script> -->

</head>

<body>
    <div class="container py-3">
        <!-- Create popover trigger button -->
        <button type="button" class="btn btn-primary" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-html="true" title="Chart">Open Chart</button>
    </div>
    <script>
        // Chart data
        // import Chart from 'chart.js/auto';
        var chartData = {
            labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
            datasets: [{
                label: 'My Dataset',
                data: [65, 59, 80, 81, 56, 55, 40],
                fill: false,
                borderColor: 'rgb(75, 192, 192)',
                tension: 0.1
            }]
        };

        // Chart options
        var chartOptions = {
            scales: {
                y: {
                    beginAtZero: true
                }
            }
        };

        // Create chart canvas
        var chartCanvas = document.createElement('canvas');
        chartCanvas.id = 'myChart';
        chartCanvas.role = "img";
        chartCanvas.setAttribute("aria-label","Hello world");
        chartCanvas.style.width = '400px';
        chartCanvas.style.height = '300px';
        console.log(chartCanvas.outerHTML);
        // Render chart
        var myChart = new Chart(chartCanvas, {
            type: 'line',
            data: chartData,
            options: chartOptions
        });
        console.log(chartCanvas.outerHTML)
        // Create popover content
        var content = '<div class="chart-container">' + chartCanvas.outerHTML + '<h1>Hello</h1>' + '</div>';
        

        // Initialize popover
        var popover = new bootstrap.Popover(document.querySelector('[data-bs-toggle="popover"]'), {
            container: 'body',
            content: content,
            html: true
        });
    </script>
      
</body>
6tqwzwtp

6tqwzwtp1#

所以,我让它工作。
I forked your CodePen, so you can see the functioning solution here.
在绘制图表之前,您的canvas元素需要已经在DOM中。因此,我更改了代码,以便仅将canvas元素插入到弹出框中。然后,我为 Bootstrap 事件“inserted.bs.popover”添加了一个事件侦听器,该事件将在弹出框插入到DOM中后调用。以下是Bootstrap弹出框事件的文档。
添加该事件侦听器的代码如下所示:

$("[data-bs-toggle='popover']").on("inserted.bs.popover", () => {
  // Invoke Chart.js to draw the chart
  new Chart("myCanvas", chartjsConfig);
});

我希望这对你的问题有帮助。

辅助功能旁

由于您希望将可访问性纳入您的图表,我还添加了一些额外的可访问性代码到该codepen。我在开源库Chart 2 Music上工作,我将其chartjs插件添加到您的代码中。您可以通过以下方式自己玩它:
1.按Tab键,直到您到达“打开图表”按钮。
1.按空格键打开按钮(这是通过Bootstrap完成的)
1.再次按Tab键。您将关注弹出框中的图表。
1.按下左/右箭头键。您将在图表中移动,并听到声音(“发音”)来表示值。
我在Chart 2 Music特定的行之前添加了注解,所以希望它不会令人困惑。
如果您有任何问题,请告诉我!

相关问题