开发者问题收集

TypeError:无法调用 null 的方法“getContext”(匿名函数)

2012-05-18
33886

我是这方面的新手,之前真的没有用过 JavaScript,所以我希望你能帮助我。我制作了一个画布,让用户使用单选按钮选择形状和颜色,然后将其绘制到画布上。我还添加了一个复选框,其中有一个选项可以为所选颜色添加渐变。以下是程序: http://people.dsv.su.se/~caak1743/Canvas/canvas.html

现在我想让形状可以在画布区域内拖放。我发现了一个代码,我认为可以修改它以在我的程序上运行,但我一直收到: TypeError:无法为以下行调用 null init (匿名函数)的方法“getContext”:

     var ctx = canvas.getContext("2d");

我不知道哪里出了问题,也不知道该如何解决。我尝试寻找具有类似问题的类似程序,但没有找到可以在这里应用的任何内容。这是我尝试合并到我的代码中的代码:

    function init() {
    var canvas = document.getElementById("myCanvas");
    var ctx = canvas.getContext("2d");
    return setInterval(draw, 10);
    }

    function draw() {
    clear();
    ctx.fillStyle = "#FAF7F8";
    rectangle(0,0,WIDTH,HEIGHT);
    ctx.fillStyle = "#444444";
    rectangle();
    }

    function myMove(e){
    if (dragok){
    x = e.pageX - canvas.offsetLeft;
    y = e.pageY - canvas.offsetTop;
    }
    }

    function myDown(e){
    if (e.pageX < x + 15 + canvas.offsetLeft && e.pageX > x - 15 +
    canvas.offsetLeft && e.pageY < y + 15 + canvas.offsetTop &&
    e.pageY > y -15 + canvas.offsetTop){
    x = e.pageX - canvas.offsetLeft;
    y = e.pageY - canvas.offsetTop;
    dragok = true;
    canvas.onmousemove = myMove;
    }
    }

    function myUp(){
    dragok = false;
    canvas.onmousemove = null;
    }

    init();
    canvas.onmousedown = myDown;
    canvas.onmouseup = myUp;
3个回答

只需将其更正为以下内容:

<script type="text/javascript">
window.onLoad=function(){ init();};
  function init() {
    var canvas = document.getElementById("myCanvas");
    var ctx = canvas.getContext("2d");
    return setInterval(draw, 10);
  }

  function draw() {
    clear();
    ctx.fillStyle = "#FAF7F8";
    rectangle(0,0,WIDTH,HEIGHT);
    ctx.fillStyle = "#444444";
    rectangle();
  }

  function myMove(e) {
    if (dragok) {
      x = e.pageX - canvas.offsetLeft;
      y = e.pageY - canvas.offsetTop;
    }
  }

  function myDown(e) {
    if (e.pageX < x + 15 + canvas.offsetLeft && e.pageX > x - 15 +
        canvas.offsetLeft && e.pageY < y + 15 + canvas.offsetTop &&
        e.pageY > y -15 + canvas.offsetTop) {
      x = e.pageX - canvas.offsetLeft;
      y = e.pageY - canvas.offsetTop;
      dragok = true;
      canvas.onmousemove = myMove;
    }
  }

  function myUp() {
    dragok = false;
    canvas.onmousemove = null;
  }

  init();
  canvas.onmousedown = myDown;
  canvas.onmouseup = myUp;
</script>

这应该可以工作。问题是画布元素需要准备好运行脚本。由于 <head> 部分中的 <script> 在加载 <canvas> 之前运行,因此会出现错误。

Avinash
2012-07-15

我找到了两个解决方案。第一种是将 jquery 添加到您的页面,这样就无需使用 html 中的 js,只需将整个 js 代码包装到

$(document).ready(function() { 您的代码在这里 });

中,这样可以让代码在 html 准备好后运行,或者只是简单地交换 head 和 body,这样就无需使用 html 中的 js (它比 js 更早执行 html) 。这些应该可以工作。

blesius
2013-12-21

您只需这样做即可消除错误。 只需在脚本前添加画布,并始终将脚本放在最后。

<body>
<canvas id="ca"></canvas>

<script type="text/javascript">

    var ca = document.getElementById("ca");
    var co = ca.getContext("2d");

// whatever your code    
</script>
</body> 
rohit
2014-03-03