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;
}
答案 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>