一、什么是事件
1、是指用户在某事务上由于某种行为所执行的操作
2、事件的要素
事件源:是指那个元素引发的事件,如:a标签、div标签
事件:事件是指执行的动作,如:单击、双击等
事件驱动程序:即执行的结果,如:单击button标签所执行的函数
二、事件的绑定
1.行内事件绑定函数
定义事件函数,在元素的事件上调用函数,此方式一个事件只能绑定一个函数
<button οnclick="foo()"></button>
<script type="text/javascript">
function foo(){
console.log("点击事件");
}
</script>
2.脚本中绑定匿名函数
<button id="btn"></button>
<script type="text/javascript">
var btn = document.getElementById("btn");
btn.onclick = function(){
console.log("点击事件");
}
</script>
3.用 addEventListener() 来绑定事件监听函数
addEventListener语法:
elementObject.addEventListener(eventName,handle,useCapture);
参数 obj 为点击的元素对象,ev为事件类型注意要去掉事件的on,只写 click、dblclick、mouseover这样的事件,fn为事件运行的函数。
elementObject:DOM对象(即DOM元素 )
eventName:事件名称。注意,这里的事件名称没有“ on ”,如鼠标单击事件 click ,鼠标双击件 doubleclick ,鼠标移入事件 mouseover,鼠标移出事件 mouseout 等
handle:事件句柄函数,即用来处理事件的函数。
useCapture:Boolean类型,是否使用捕获,一般用false。
<button id="btn"></button>
<script type="text/javascript">
var btn = document.getElementById("btn");
btn.addEventListener("click",function(){
console.log("点击事件");
})
</script>
特点:
1、行内绑定:绑定函数是唯一的,可以在调用的时候传入参数,但参数是固定的值,不建议使用
2、在脚本中使用onxxxx绑定函数:可以绑定多个函数,但是后面绑定的函数会替换掉前面的函数,最终只会执行最后一个,直接给引用的方式不能传参,如果要传参必须使用匿名函数,在匿名函数中调用事件的函数并传参。
3、使用addEventListener:可以绑定多个函数,并且多个函数依次执行,如果在传参与2的方式相同
三、DOM的常用事件与基本操作
1、鼠标移动事件
•鼠标移动事件包括鼠标移入、移出、和移动事件
•移入: onmouseover
•移出: onmouseout
•移动: onmousemove
<button id="btn"></button>
<script type="text/javascript">
var box = document.getElementById("box");
//鼠标移入
box.onmouseover = function(){
console.log("鼠标移入");
}
//鼠标移动
box.onmousemove = function(){
console.log("鼠标移动");
}
//鼠标移出
box.onmouseout = function(){
console.log("鼠标移出");
}
</script>
例题:鼠标的拖拽效果
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
div{
width: 100px;
height: 100px;
background: red;
position: absolute;
left: 0;
top: 0;
}
</style>
</head>
<body>
<div id="box">
<!--<button id="btn">回放</button>-->
</div>
<script type="text/javascript">
// 选中元素之中让元素发生跟随鼠标移动的行为;
// 1. 鼠标按下 : 拖拽开始;
// 2. 鼠标移动 : 拖拽进行中;
// 3. 鼠标抬起 : 拖拽结束;
//绑定id名为box的div
var box = document.getElementById("box");
//判断是否开启状态--拖拽默认没有开始
var drag_start = false;
//因为当鼠标按下的时候,会需要到左上的坐表
var offset_x = null;
var offset_y = null;
//1. 鼠标按下 : 拖拽开始
box.onmousedown = function( evt ){
//console.log("拖拽开始");
drag_start = true;
var e = evt || event;
//获取鼠标按下时,距离元素边框的x轴和y轴的位置
offset_x = e.offsetX;
offset_y = e.offsetY;
}
// 2. 鼠标移动 : 拖拽进行中;
//鼠标移动,就必须用到鼠标的位置,就必须使用到事件对象,则创建evt
document.onmousemove = function( evt ){
//console.log("拖拽进行中");
//如果拖拽默认没有开始,那么后边的代码不执行
if( drag_start === false ){ return false }
var e = evt || event;
//给box设置x,y值
box.style.left = e.clientX - offset_x +"px";
box.style.top = e.clientY - offset_y +"px";
}
// 3. 鼠标抬起 : 拖拽结束;
box.onmouseup = function(){
//console.log("拖拽结束");
//拖拽结束drag_start = false
drag_start = false;
}
</script>
</body>
</html>
2、鼠标位置的获取
•鼠标的位置可以通过事件对象获取
•要获取事件对象,必须在事件函数中定义形参,在调用函数时传入”event”对象
<button id="btn"></button>
<script type="text/javascript">
var box = document.getElementById("box")
box.onclick = function( evt ){
var e = evt || event;
console.log(e);
}
</script>
属性名 | 描述 |
---|---|
clientX/clientY | 事件发生的时候,鼠标相对于浏览器窗口可视文档区域的左上角的位置;在DOM标准中,这两个属性值都不考虑文档的滚动情况,也就是说,无论文档滚动到哪里,只要事件发生在窗口左上角,clientX和clientY都是 0,所以在IE中,要想得到事件发生的坐标相对于文档开头的位置,要加上document.body.scrollLeft和 document.body.scrollTop |
offsetX,offsetY | 事件发生的时候,鼠标相对于源元素左上角的位置 |
pageX,pageY | 检索相对于父元素鼠标水平坐标的整数 |
screenX、screenY | 鼠标指针相对于显示器左上角的位置,如果你想打开新的窗口,这两个属性很重要 |
例题:一个跟随鼠标移动的效果
<style type="text/css">
div{
width: 100px;
height: 100px;
background: yellow;
position: absolute;
}
</style>
<div id="box"></div>
<script type="text/javascript">
window.onload = function(){
document.onmousemove = function( evt ){
var e = evt || event;
var oDIV = document.getElementById("box");
var scrollTop = document.documentElement.scrollTop||document.body.scrollTop;
var scrollLeft = document.documentElement.scrollLeft||document.body.scrollLeft;
oDIV.style.left = e.clientX + scrollLeft + "px";
oDIV.style.top = e.clientY + scrollTop + "px";
}
}
</script>
扩展效果:一连串元素跟随鼠标效果
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
div{
width: 50px;
height: 50px;
background: red;
position: absolute;
}
</style>
</head>
<body>
<div></div><div></div><div></div><div></div><div></div>
<div></div><div></div><div></div><div></div><div></div>
<div></div><div></div><div></div><div></div><div></div>
<div></div><div></div><div></div><div></div><div></div>
<div></div><div></div><div></div><div></div><div></div>
<script type="text/javascript">
window.onload = function(){
var oDIV = document.getElementsByTagName("div");
document.onmousemove = function( evt ){
var e = evt || event;
for(var i = oDIV.length - 1 ; i > 0 ; i --){
oDIV[i].style.left = oDIV[i - 1].style.left;
oDIV[i].style.top = oDIV[i - 1].style.top;
}
oDIV[0].style.left = e.clientX + "px";
oDIV[0].style.top = e.clientY + "px";
}
}
</script>
</body>
</html>
3.按键事件的处理
(1).事件与描述:
onkeydown----某个键盘的键被按下
onkeypress-—某个键盘的键被按下或按住
onkeyup-----某个键盘的键被松开
(2).事件对象的属性
属性 与描述
altKey:返回当事件被触发时,“ALT” 是否被按下。
ctrlKey :返回当事件被触发时,“CTRL” 键是否被按下。
shiftKey:返回当事件被触发时,“SHIFT” 键是否被按下。
keyCode/which:对于 keypress 事件,该属性声明了被敲击的键生成的Unicode 字符码。对于 keydown 和 keyup 事件,它指定了被敲击的键的虚拟键盘码。虚拟键盘码可能和使用的键盘的布局相关。
按键示例: 聊天对话框
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style type="text/css">
*{
font-size: 14px;
padding:0;
margin:0;
}
.main{
position: relative;
margin: 20px auto;
border: 1px solid steelblue;
width: 430px;
height: 400px;
}
.msgInput{
display: block;
width: 406px;
height: 60px;
margin: 10px auto;
}
.sendbtn{
position: absolute;
width: 100px;
height: 29px;
bottom: 5px;
right: 10px;
}
.content{
list-style: none;
width: 410px;
height: 280px;
margin: 5px auto;
border: 1px dotted #D1D3D6;
overflow-y: scroll;
}
.msgContent{
width:auto;
max-width: 250px;
height: auto;
word-break: break-all;
margin: 5px;
padding: 3px;
border-radius: 5px;
}
.content .left{
float: left;
text-align: left;
background-color: lightgrey;
}
.content .right{
float: right;
text-align: right;
background-color: yellowgreen;
}
</style>
</head>
<body>
<div id="main" class="main">
<ul id="content" class="content">
<li class="msgContent left">hello?</li>
<div style="clear: both;"></div>
<li class="msgContent left">hello</li>
<div style="clear: both;"></div>
<li class="msgContent right">hi</li>
<div style="clear: both;"></div>
<li class="msgContent left">hehe</li>
<div style="clear: both;"></div>
<li class="msgContent left">goodbye</li>
<div style="clear: both;"></div>
<li class="msgContent right">。。。。</li>
<div style="clear: both;"></div>
<li class="msgContent right">sdfasdsadfassdfsdfsdfdsfsdfsdfsdfdfasdffasdfasfdasd fasd fasd fasdfasdfasdf</li>
</ul>
<textarea id="msg_input" class="msgInput"></textarea>
<button id="sendbtn" class="sendbtn">发送</button>
</div>
</body>
<script>
var sendbtn_ele = document.getElementById("sendbtn");
var msg_ipt_ele = document.getElementById("msg_input");
var content_ele = document.getElementById("content");
// 添加事件 :
sendbtn_ele.onclick = function(){
sendMsg();
}
// alt + 回车;
msg_ipt_ele.onkeydown = function( evt ){
var e = evt || event;
var keyCode = e.which || e.keyCode;
// 按下alt键的同时 按下回车
if( e.altKey && keyCode === 13){
sendMsg();
}
}
// 信息发送功能; => DOM操作;
// 所有输入内容都在textarea里面所以我们必须要先去进行数据的获取;
function sendMsg(){
// 1. 取值;
var ipt_value = msg_ipt_ele.value;
// 2. 创建元素;
var li = document.createElement("li");
var div = document.createElement("div");
// 3. 建立 元素的基本结构;
li.className = "msgContent right"
// li.innerHTML = ipt_value;
li.innerText = ipt_value;
div.style.clear = "both";
// 4. 元素插入;
content_ele.appendChild(div);
content_ele.appendChild(li);
// 5. 用户体验优化;
li.scrollIntoView();
// 6. 清空输入框之内的内容;
msg_ipt_ele.value = "";
// 7. 让输入框获取焦点 :
// 获得焦点;
msg_ipt_ele.focus();
// 失去焦点;
// msg_ipt_ele.blur();
// 选中文字;
// msg_ipt_ele.select();
}
</script>
</html>