开发者问题收集

当使用 react.js 和 chart.js 时出现“TypeError: document.getElementById(...) is null”

2015-09-06
6509

我同时使用 react 和 chart.js 来绘制条形图。但在 chart.js 中,我们必须使用画布标签,要找到该标签并在其中放置条形图,我们使用常规的 document.getElementById() 方法。我尝试了很多组合,比如将 document.getElementById() 放在开头,或者放在 $(document).ready() 中,甚至在 react 的 componentDidMount() 方法中。但我仍然收到“ TypeError: document.getElementById(...) is null ”。如果有人知道,请给我一个建议。 谢谢。

这是我尝试执行的代码:

var React = require("react");

var Chart = React.createClass({

    getDefaultProps: function() {
        barChartData = {
            labels : ["Option1", "Option2"],
            datasets : [
                {
                    fillColor : "rgba(220,220,220,0.5)",
                    strokeColor : "rgba(220,220,220,0.8)",
                    highlightFill: "rgba(220,220,220,0.75)",
                    highlightStroke: "rgba(220,220,220,1)",
                    data : [65, 35]
                }
            ]
        }
    },

    onload: function() {
        console.log(document.getElementById('canvas_poll'));
        var ctx = document.getElementById("canvas_poll").getContext("2d");

        window.myBar = new Chart(ctx).HorizontalBar(this.props.barChartData, {
            responsive : true,
        });
    },

    componentDidMount: function() {
        this.onload();
    },

    render: function() {

        return (
            <div>
                <canvas classID="canvas_poll" height={100} width={600}></canvas>
            </div>
        );
    }

});

module.exports = Chart;
2个回答

我在构建 React Web 应用时遇到了类似的问题。除了上一个解决方案中提到的内容外,根据我在评论中看到的内容,我认为您可能会发现一些有用的内容。

脚本在元素实际存在之前运行

一个常见的问题是元素在呈现时不存在。

例如,如果您的 HTML 看起来像

    <script src="**your file **" type="text/babel"></script>
    <div id="canvas_poll"></div>

那么您的脚本将在呈现具有您正在寻找的 id 的 div 之前运行。 但是,切换后,脚本在 div 形成后运行。

    <div id="canvas_poll"></div>
    <script src="**your file **" type="text/babel"></script>

这样,脚本正在寻找的元素实际上存在并且可以找到。

此链接中列出了一些解决方案 为什么 jQuery 或 getElementById 等 DOM 方法找不到元素?

将 <div /> 更改为 <div></div>

就我而言,在 div 形成后运行脚本后,我仍然从 getElementById 方法中获取 null。最终,它变成了目标 div 的设置方式。

我不确定为什么,但是当我的目标 div 看起来像

    <div id= "target1"/>
    <script src="target1.jsx" type="text/babel"></script>

时,我可以使用 react 渲染到该容器。但是,如果我尝试渲染第二个 react 元素:

    <div id= "target1"/>
    <script src="target1.jsx" type="text/babel"></script>
    <div id= "target2"/>
    <script src="target2.jsx" type="text/babel"></script>

第一个 react 元素会显示,但第二个不会显示。 我修复它的方法就是将所有目标 div 上的 div 格式从

     <div id="target"/>

更改为

     <div id="target></div>

在我做出这一改变之后,我的所有 react 元素都正常显示。我不确定为什么它会这样工作,但我希望它有所帮助。

wolfaviators
2015-12-07

document.getElementById() 使用元素的“ID”属性,而不是“classID”(“canvas”标签也不支持该属性)。尝试将 id="canvas_poll" 添加到 canvas 元素,如下所示:

<canvas id="canvas_poll" height={100} width={600}></canvas>
Callan Heard
2015-09-06