代码之家  ›  专栏  ›  技术社区  ›  Engine

JS和HTML5入门

  •  0
  • Engine  · 技术社区  · 7 年前

    我尝试在HTML5上使用画布和JS绘制对象。为此我有两个文件 index.html

        <html>
    <body>
        <canvas id="myCanvas"></canvas>
        <script type="text/javascript" src="script.js">
         </script>  
    </body>
    </html>
    

    据我所知,我是来这里的 script.js 包括以下内容:

    var myCanvas = document.getElementById("myCanvas");
    myCanvas.width = 500;
    myCanvas.height = 500;
    
    var ctx = myCanvas.getContext("2d");
    
    
    function drawLine(ctx, startX, startY, endX, endY){
        ctx.beginPath();
        ctx.moveTo(startX,startY);
        ctx.lineTo(endX,endY);
        ctx.stroke();
    }
    
    function drawArc(ctx, centerX, centerY, radius, startAngle, endAngle){
        ctx.beginPath();
        ctx.arc(centerX, centerY, radius, startAngle, endAngle);
        ctx.stroke();
    }
    function drawPieSlice(ctx,centerX, centerY, radius, startAngle, endAngle, color ){
        ctx.fillStyle = color;
        ctx.beginPath();
        ctx.moveTo(centerX,centerY);
        ctx.arc(centerX, centerY, radius, startAngle, endAngle);
        ctx.closePath();
        ctx.fill();
    }
    
    this.drawLine(_ctx,100,100,200,200);
    this.drawArc(_ctx, 150,150,150, 0, Math.PI/3);
    this.drawPieSlice(_ctx, 150,150,150, Math.PI/2, Math.PI/2 + Math.PI/4, '#ff0000');
    

    索引.html 我看不到一条线或一条弧,所以我的问题是我在这里遗漏了什么?

    提前谢谢!

    3 回复  |  直到 7 年前
        1
  •  1
  •   jmargolisvt    7 年前

    你有 _ctx ctx .

        2
  •  1
  •   ChrisG    7 年前

    为了完整起见,这里有三个选项(从最佳到最差列出):

    1. 使用 var _ctx = myCanvas.getContext("2d");
      这将修复您的代码,并且您的函数可用于其他上下文

    2. 拆下 ctx / _ctx
      这样函数就使用现有的全局变量

    3. 改变现状的建议解决方案 ctx公司
      这修复了代码,但掩盖了您的本地 是对全局函数的跟踪,这里不需要将上下文传递到函数中;在我个人看来,这是最不可读的选择和糟糕的做法

    还有第四个选项,我更喜欢,但它涉及到JavaScript的 prototype

    CanvasRenderingContext2D.prototype.drawLine = function (startX, startY, endX, endY) {
      this.beginPath();
      this.moveTo(startX, startY);
      this.lineTo(endX, endY);
      this.stroke();
    }
    

    现在,您已经将自己的自定义函数添加到浏览器的API中,使其对所有用户都可用 CanvasRenderingContext2D 物体。你可以这样称呼它:

    ctx.drawLine(100, 100, 200, 200);
    
        3
  •  0
  •   Mina Ragaie    7 年前

    只要改变 _ctx 成为 ctx

    this.drawLine(ctx,100,100,200,200);
    this.drawArc(ctx, 150,150,150, 0, Math.PI/3);
    this.drawPieSlice(ctx, 150,150,150, Math.PI/2, Math.PI/2 + Math.PI/4, '#ff0000');
    

    并且总是检查控制台选项卡,因为当我在浏览器中尝试你的代码时,出现了这个错误 Uncaught ReferenceError: _ctx is not defined