JavaScript鼠标、键盘交互事件的注册与移除

需求说明

我希望页面上存在某个区域,点击之后执行某种效果(以显示文字为例)。

HTML代码说明

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>hw2</title>
    <style>
        /* CSS */
        canvas{
            border-width:1px;
            border-style:solid;
            border-color:black;
        }
    </style>
</head>
<body>
    <canvas id="myCanvas" width="800" height="400"></canvas>
    <script src="your/path.js"></script>
</body>
</html>

我希望在鼠标点击这个canvas或者键盘按下某个键之后在canvas中心位置显示一个字符“H”。

JavaScript部分

首先分析需求,为了显示字符H,我们首先要实现一个drawText()函数,Align设置center,Baseline设置middle等。

let text={  //对象的定义
    fontSize:64,
    align:'center',
    baseline:'middle',
    style:'red',
    text:'',
    x:0,
    y:0
};
function drawText(text){
    context.font=text.fontSize + 'px sans-serif';
    context.textAlign=text.align;
    context.textBaseline=text.baseline;
    context.fillStyle=text.style;
    context.fillText(text.text,text.x,text.y);
}

接下来我们需要注册鼠标、键盘监听:

canvas1.onclick=onCanvasClick;
window.onkeydown=onKeydown;

其中onCancasClick和onKeydown函数需要我们来实现,因为最终目的是一样的,我们就只编写onCanvasClick函数,onKeydown函数就调用onCanvasClick函数,而onCancasClick函数又可以调用drawText函数,只需要进行传参即可,具体代码如下:

function onCanvasClick(){  //事件处理函数
    //画红色的H
    text.text="H";
    text.x=canvas1.width/2;
    text.y=canvas1.height/2;
    drawText(text);
    //移除事件侦听
    canvas1.onclick=null;

}
function onKeydown(e){
    if(e.keyCode===13){
        onCanvasClick();
        windown.onkeydown=null;
    }
}

我们这样反复提取函数的目的是为了精简代码,提高代码可读性和可维护性。

再加上一些其它的代码补全内容,完整的JavaScript代码如下:

let canvas1=document.getElementById("myCanvas");
let context=canvas1.getContext('2d');

let text={  //对象的定义
    fontSize:64,
    align:'center',
    baseline:'middle',
    style:'black',
    text:'',
    x:0,
    y:0
};

function drawText(text){
    context.font=text.fontSize + 'px sans-serif';
    context.textAlign=text.align;
    context.textBaseline=text.baseline;
    context.fillStyle=text.style;
    context.fillText(text.text,text.x,text.y);
}

function drawLine(xs,ys,xe,ye,style){
    context.beginPath();//开启新路径
    context.moveTo(xs,ys);
    context.lineTo(xe,ye);
    context.strokeStyle=style;
    context.stroke();
}

function onCanvasClick(){  //事件处理函数
    //画红色的H
    text.text="H";
    text.x=canvas1.width/2;
    text.y=canvas1.height/2;
    text.style="red";
    drawText(text);
    //移除事件侦听
    canvas1.onclick=null;

}

function onKeydown(e){
    if(e.keyCode===13){
        onCanvasClick();
        windown.onkeydown=null;
    }
}

function init(){
    //注册鼠标的click事件侦听
    canvas1.onclick=onCanvasClick;
    //注册键盘的keydown事件侦听
    window.onkeydown=onKeydown;
}

init();





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值