JS事件分为鼠标事件与键盘事件。想要保证事件被处罚一般要给document加事件监听。document可以理解为html标签外层的一个隐藏父标签,平时是看不到的,我们可以把它console.log一下,如下图:
JS事件需要使用event对象,比如这样:
document.onclick = function(ev) { alert(ev); }
这样会弹出“object mouseevent”,即鼠标点击对象,但是IE8以下并不能识别ev,FF又不识别event,所以我们要简单的做一下兼容处理:
var oEvent = ev||event; //为防止事件冲突,还得给事件设置防止冒泡 oEvent.cancelBubble = true;
这样处理后直接用oEvent对象就可以了。cancelBubble翻译过来就是冒泡的意思。另外,jQuery的event.stopPropagation()也可以防止冒泡。
鼠标点击事件最常见的应用就是获取鼠标的坐标,然后让元素跟随鼠标位置的变化进行移动。一个获取鼠标位置的简单例子:
document.onclick = function(ev) { var oEvent = ev||event; alert(oEvent.clientX +"+"+oEvent.client.Y); }
值得注意的是,event.clientY获取到的坐标是基于可视区域的相对坐标值,如果我们把这个值添加给DOM元素的话,还必须要考虑到scrollTop的值,就像这样:
document.onmouseover = function(ev) { var oEvent = ev||event; var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; document.title = "X="+oEvent.clientX + "px" +"Y="+oEvent.clientY + scrollTop + "px"; }
为了日后方便使用,我们可以将此方法封装成一个函数:
function getPos(ev) { var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft; //以JSON的形式返回 return {x:ev.clientX+scrollLeft ,y:ev.clientY+scrollTop}; } var pos = getPos(oEvent); //获取X: console.log(pos.x); //获取y: console.log(pos.y);
键盘的事件也比较简单,如下是将文本框里的值通过点击ctrl+enter键赋给textarea的一个小demo:
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>键盘事件demo</title> </head> <body> <input type="text" id="txt1"> <br> <textarea name="" id="txt2" cols="30" rows="10"></textarea> <script> var oTxt1 = document.getElementById("txt1"); var oTxt2 = document.getElementById("txt2"); oTxt1.onkeydown = function(ev) { var oEvent = ev||event; //oEvent.keyCode = oEvent.which if ( oEvent.keyCode == 13 && oEvent.ctrlKey) //JS提供的方法有ctrlkey,shiftkey,altkey { oTxt2.value += oTxt1.value+" "; oTxt1.value = ''; } }; </script> </body> </html>
最常见的按键事件应用就是按回车登录了,少点下鼠标操作很流畅。另外课程里还提到利用方向键控制元素移动的方法,不过长按按键本身是带有延迟的,因此控制元素移动的时候会在开始有轻微的卡顿,于是我找到了这篇博客:键盘控制div移动并且解决停顿问题(原生js)—— 浅吟清唱,大家可以去看一下,想法很精妙,下面直接放代码:
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Title</title> <style> #move{ position: absolute; top: 30px; 30px; height: 30px; background-color: #ff3b2d; z-index:99; } </style> </head> <body> <div id="move"></div> <script> window.onload = function(){ //获取Div元素 var oDiv = document.getElementById("move"); //创建各个方向条件判断初始变量 var left = false; var right = false; var top = false; var bottom = false; //当按下对应方向键时,对应变量为true document.onkeydown = function(ev){ var oEvent = ev || event; var keyCode = oEvent.keyCode; switch(keyCode){ case 37: left=true; break; case 38: top=true; break; case 39: right=true; break; case 40: bottom=true; break; } }; //设置一个定时 setInterval(function(){ //当其中一个条件为true时,则执行当前函数(移动对应方向) if(left){ oDiv.style.left = oDiv.offsetLeft-10+"px"; }else if(top){ oDiv.style.top = oDiv.offsetTop-10+"px"; }else if(right){ oDiv.style.left = oDiv.offsetLeft+10+"px"; }else if(bottom){ oDiv.style.top = oDiv.offsetTop+10+"px"; } },20); //执行完后,所有对应变量恢复为false,保持静止不动 document.onkeyup = function(ev){ var oEvent = ev || event; var keyCode = oEvent.keyCode; switch(keyCode){ case 37: left=false; break; case 38: top=false; break; case 39: right=false; break; case 40: bottom=false; break; } } } </script> </body> </html>
以上。
本课程内容整理自智能社的JS视频课程与浅吟清唱的简书博客。