鼠标点击比较的坐标

时间:2013-04-28 12:03:36

标签: javascript html html5 html5-canvas

link for the code 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;

       }

1 个答案:

答案 0 :(得分:1)

您现有代码的一些问题:

请注意,您的“圆圈”是垂直拉伸的。那是因为画布的默认大小是300px宽和150px高。当您使用CSS将其大小设置为400x400时,画布会不成比例地延伸。要避免这种情况,请在canvas标记或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>