0

代码链接 1.以下代码在 html5 画布上绘制一个圆圈,并添加一个事件监听器以获取鼠标点击。圈内的鼠标点击无法与圈外的点击区分开来。

     <body>
     <canvas id="canvas" onclick="handleEvent()"></canvas>
     </body>

      body{
      background: #3e3e3e;
       }
      #canvas{
     background:white;
     height: 400px;
     width: 400px;
     border: 2px solid yellow;
       }


      window.onload=function(){
      var canvas=document.getElementById('canvas');
      var ctx=canvas.getContext('2d');

      var cx=canvas.width/2;
      var cy=canvas.height/2;
      var r=20;
       //circle draw function
      ctx.beginPath();
      ctx.arc(cx,cy,r,0,2*Math.PI,false);
      ctx.stroke();
       }

      //function to get mouse click coordinates
      function handleEvent(e)
      {
        var evt = e ? e:window.event;
        var clickX=0, clickY=0;
       if (evt.pageX || evt.pageY)
       {
         clickX = evt.pageX;
         clickY = evt.pageY;
        }
       if(180<evt.pageX<220)
        {
         alert("you are inside the circle");
        }

       alert (evt.type.toUpperCase() + ' mouse event:'
       +'\n pageX = ' + clickX
       +'\n pageY = ' + clickY 
        )
       return false;

       }
4

1 回答 1

1

您现有代码的一些问题:

请注意,您的“圆圈”是垂直拉伸的。这是因为画布的默认大小是 300 像素宽和 150 像素高。当您使用 CSS 将其大小调整为 400x400 时,画布会不成比例地拉伸。为避免这种情况,请在画布标签或 JavaScript 中而不是 CSS 中设置画布大小。

// in html 
<canvas id="canvas" width="400px" height="400px"></canvas>

// in javascript (do this before any drawing)
var canvas=document.getElementById(“canvas”);
canvas.width=400;
canvas.height=400;

由于您正在对在画布坐标(而不是窗口坐标)中生成的圆进行命中测试,因此您也必须在画布坐标中获取鼠标点击的位置。这是一个两步的过程。

首先,获取画布相对于窗口的位置

var canvas=document.getElementById("canvas");
var offsetX=canvas.offsetLeft;
var offsetY=canvas.offsetTop;

其次,在处理鼠标点击时,您可以获得相对于画布的鼠标位置,如下所示:

var evt = e ? e:window.event;
clickX = evt.clientX-offsetX;
clickY = evt.clientY-offsetY;

这是您的命中测试的更好版本。这使用勾股定理来查看鼠标点击是否在圆的半径内:

var dx=cx-clickX;
var dy=cy-clickY;

if( dx*dx+dy*dy <= r*r )
{
  alert("you are inside the circle");
}

(可选)这里是如何使用 javascript 来监听画布中的点击事件:

canvas.addEventListener("click",handleEvent);

(可选)你可以看看 jQuery,它是一个可靠的、优秀的库,可以处理跨浏览器的差异,所以你不必这样做:

var evt = e ? e:window.event;

这是代码和小提琴:http: //jsfiddle.net/m1erickson/zLzwU/

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>

<style>
    body{
      background: #3e3e3e;
    }
    #canvas{
      background:white;
      border: 2px solid yellow;
    }    
</style>

<script>
window.onload=function(){

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

    var offsetX=canvas.offsetLeft;
    var offsetY=canvas.offsetTop;

    var cx=canvas.width/2;
    var cy=canvas.height/2;
    var r=20;

    ctx.beginPath();
    ctx.arc(cx,cy,r,0,2*Math.PI,false);
    ctx.closePath();
    ctx.stroke();

    function handleEvent(e){

        var evt = e ? e:window.event;
        clickX = evt.clientX-offsetX;
        clickY = evt.clientY-offsetY;

        var dx=cx-clickX;
        var dy=cy-clickY;

        if( dx*dx+dy*dy <= r*r )
        {
          alert("you are inside the circle");
        }

        return false;
    }

    canvas.addEventListener("click",handleEvent);


}; // end init;
</script>

</head>

<body>
    <canvas id="canvas" width="400px" height="400px"></canvas>
</body>
</html>
于 2013-04-28T15:54:12.480 回答