为什么document.getElementById返回null值?

时间:2013-06-22 21:56:44

标签: javascript html5 web-applications canvas html5-canvas

我调试了我的代码并意识到我的Javascript中的方法无法正常工作。任何人都知道为什么?

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Tetris</title>
<link rel="stylesheet" href="css/app.css">
<script type="text/javascript" src="js/main.js"></script>
</head>
<body>
<canvas id="tetrisBoard" width="800" height="600">
  Your browser does not support HTML 5.
</canvas>
<p>
</p>
</body>
</html>   

main.js

board = document.getElementById("tetrisBoard")                                                                                                                                                              
ctx = board.getContext("2d")
ctx.fillStyle = "rgb(200, 0, 0)"
ctx.fillRect 10, 10, 55, 50

document.getElementById("tetrisBoard")的结果是空值。为什么呢?

3 个答案:

答案 0 :(得分:5)

因为您在元素存在之前调用代码。将脚本放在关闭正文标记之前,你会没事的。

答案 1 :(得分:1)

另一种解决方案是做这样的事情:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Tetris</title>
        <link rel="stylesheet" href="css/app.css">
        <script type="text/javascript" src="js/main.js"></script>
    </head>
    <body onload="setup();">
        <canvas id="tetrisBoard" width="800" height="600">
            Your browser does not support HTML 5.
        </canvas>
        <p>
        </p>
   </body>
</html>

然后,在main.js中使用以下内容:

function setup() {
    // Your code here
}

关于这一点的好处是你不必将脚本标记放在一个不直观和不标准的位置(例如在正文结束之前)。

答案 2 :(得分:0)

此外,您可以让脚本等到它加载的所有DOM ...就像这样:

  

使用jquery

 $(document).ready(function(){
    board = document.getElementById("tetrisBoard")                                                                                                                                                              
ctx = board.getContext("2d")
ctx.fillStyle = "rgb(200, 0, 0)"
ctx.fillRect 10, 10, 55, 50
    });
  

vanilla JavaScript:

    document.addEventListener("DOMContentLoaded", function () {
      board = document.getElementById("tetrisBoard")                                                                                                                                                              
ctx = board.getContext("2d")
ctx.fillStyle = "rgb(200, 0, 0)"
ctx.fillRect 10, 10, 55, 50
      }, false);