day11
1. 事件对象
(1)事件:对某个元素的某种操作
(2)事件对象:当某个事件触发时产生的对象,就是事件对象。
留神:event 应用前提,必须有事件;也就是说没有事件,就没有事件对象;
不同的对象产生的事件不同。
事件对象的兼容:var e = evt || event;
事件的三要素:
- 元素(div)
- 事件类型 (onclick)
- [事件对象] (event)
<script type="text/javascript">
document.onclick = function(evt){
// 事件对象 event 兼容写法
var e = evt || event;
console.log(e);
}
</script>
案例:小老虎跳一跳
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
#box{
width: 100px;
height: 100px;
border: 1px solid black;
/* 要使元素挪动, 须要增加定位 */
position: absolute;
top: 500px;
left:200px;
background-image: url(img/3.jpg);
background-size: 100px 100px;
}
/* img{
width: 100px;
height: 100px;
} */
</style>
</head>
<body>
<div id="box">
<!-- ![](img/3.jpg) -->
</div>
</body>
</html>
<script type="text/javascript">
// 要求: 点击大白板, 使图片向上挪动 200px, 凌空 2s, 返回到原来地位
var oDiv = document.querySelector('#box');
document.onclick = function(){
// 留神: 写应用 oDiv.style.top 数值 + 单位 字符串
// 读应用 oDiv.offsetTop 数值, 无单位
oDiv.style.top = oDiv.offsetTop - 200 + 'px';
// 延时定时器
setTimeout(function(){oDiv.style.top = 500 +'px';},2000);
}
</script>
2. 鼠标事件对象的属性
坐标属性:
- pageX/ pageY 鼠标绝对于 整个文档 左侧和顶部的坐标。罕用
- clientX / clientY 鼠标绝对于 部分窗口 的左侧和顶部的坐标。
-
offsetX /offsetY 鼠标绝对于外部元素的间隔左侧和顶部的坐标。
- 鼠标间隔 最近的父元素 左顶点的坐标
- 罕用于拖拽
案例:图片追随鼠标挪动
3. 键盘事件
- 键盘事件对象都是通过 document 来触发的
-
键盘事件:
-
(1)keyUp: 用户开释某一个按键时产生
document.onkeydown = function(){console.log('haha'); }
-
(2)keyDown: 用户按下按键时产生
document.onkeyup = function(){console.log('xixi'); }
-
(3)keyPress: 用户按下按键,并且产生一个字符时产生(意思就是说按 ctrl 这样的按键没有成果的)
document.onkeypress = function(){console.log('xixihaha'); }
-
-
键盘对象
-
(1)keyCode: 键盘录入时字母所对应 ASCII 码
- A:65
a:970:48
回车:13
ctrl+ 回车:10
- A:65
- (2) ctrlKey 返回当事件被触发时,”Ctrl” 是否被按下, 返回值为 true or false
// 键盘检测兼容写办法 var key = e.keyCode || e.which || e.charCode;
-
<script type="text/javascript">
document.onkeypress = function(evt){
var e = evt || event;
var key = e.keyCode || e.charCode || e.which;
console.log(key);
console.log(e.ctrlKey);
if(e.keyCode==10 && e.ctrlKey){console.log('发送');
}
}
</script>
4. 事件流
(1)概念:
- 当某个事件执行时,从子元素向父元素触发 或 从父元素向子元素触发 称为事件流
(2)事件流的两种模式:
事件冒泡
- 从子元素向父元素触发 —> 当某个事件触发时,同样的事件会向父元素触发。
- 留神:但并不是所有事件都会产生冒泡问题 onfocus onblur onload 不会产生冒泡问题。
事件的冒泡:
文档构造:window document.body body 元素
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
#father{
width: 200px;
height: 200px;
border: 1px solid red;
}
#son{
width: 100px;
height: 100px;
border: 1px solid red;
}
</style>
</head>
<body>
<div id="father">
<div id="son">
</div>
</div>
</body>
</html>
<script type="text/javascript">
var oF = document.getElementById('father');
var oS = document.getElementById('son');
oS.onclick = function(){console.log('oS');
}
oF.onclick = function(){console.log('oF');
}
document.body.onclick= function(){console.log('o-body');
}
document.onclick = function(){console.log('o-document');
}
window.onclick = function(){console.log('o-window');
}
</script>
阻止事件冒泡
// 兼容写法
e.stopPropagation?e.stopPropagation():e.cancelBubble='true';
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
ul{display: none;}
</style>
</head>
<body>
<button type="button"> 显示 </button>
<ul>
<li> 抓鸭子 </li>
<li> 抓几只 </li>
<li> 抓 1 万只 </li>
<li> 抓到了 </li>
<li> 嘎嘎嘎嘎嘎 </li>
</ul>
</body>
</html>
<script type="text/javascript">
var oUl = document.querySelector('ul');
var oBtn = document.querySelector('button');
oBtn.onclick = function(evt){
var e = evt || event;
oUl.style.display = 'block';
// 测试该办法是否存在, 若不存在, 返回 undefined
console.log(e.stopPropagation);
console.log('点击按钮');
// 三目运算:
// 依据表达式 1 的虚实, 来决定是执行表达式 2 还是表达式 2
// 如果表达式 1 为真, 则执行表达式 2, 最终返回表达式 2 的后果
// 如果表达式 2 为假, 则执行表达式 3, 最终返回表达式 3 的后果
// 阻止冒泡事件 兼容写法
e.stopPropagation?e.stopPropagation():e.cancelBubble='true';}
document.onclick = function(){
oUl.style.display= 'none';
console.log('点击大白板');
}
</script>
阻止事件的默认行为
// 兼容写法
e.preventDefault?e.preventDefault():e.returnValue = false;
// 或者简化的兼容写法
return false;
- 阻止鼠标右键
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title> 鼠标右键事件 </title>
<style type="text/css">
#box{
height: 100px;
width: 100px;
background-color: hotpink;
position: absolute;
}
</style>
</head>
<body>
<div id="box">
</div>
</body>
</html>
<script type="text/javascript">
var oBox = document.querySelector('#box');
document.oncontextmenu = function(evt){// console.log('haha');
var e = evt||event;
oBox.style.left = e.pageX + 'px';
oBox.style.top = e.pageY + 'px';
// 阻止浏览器默认行为
// e.preventDefault();// 非 ie
// 兼容写法
// e.preventDefault?e.preventDefault():e.returnValue=false;
// 简化写法
return false;
}
</script>
-
阻止超链接
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <a href="http://www.baidu.com"> 跳转 </a> </body> </html> <script type="text/javascript"> var oA = document.querySelector('a'); oA.onclick = function(evt){ var e = evt||event; e.preventDefault?e.preventDefault():e.returnValue=false; // return false; } </script>
事件捕捉
- 从父元素向子元素触发