事件:是元素天生自带的默认操做行为,不论咱们是否给其绑定了方法,当咱们操做的时候,也会把对应的事件触发;javascript
事件绑定:是给元素的某个行为绑定一个方法,目的是当事件行为触发的时候,能够作一些事情css
鼠标点击:鼠标按下弹起算一次点击html
鼠标按下:不分左右键或者滚轮,只要按下/抬起就会触发java
鼠标滚动浏览器
鼠标移动:鼠标尖端移动触发函数
鼠标通过性能
鼠标进入动画
如何选用:项目中,若是一个容器中有后代元素,想要鼠标进入和离开作啥事,咱们通常都用mouseenter和mouseleave。ui
能绑定键盘事件的有:
input
、textarea
、window
、document.body
等this
- 若是想给不能编辑的元素绑定键盘事件,须要给这个元素加一个:
contenteditable = "true"
使用范围:input ......
使用范围:音频、视频
其它经常使用事件
单手指事件模型 Touch
多手指事件模型 Gesture
事件行为还有不少,这里咱们暂时列举这些;更多的内容能够参考 MDN,事件参考; 或者能够查看元素的属性(属性中onxxx就是元素拥有的事件行为)
box.onclick = function () {
console.log('哈哈哈~~');
}
box.onclick = function () {
console.log('呵呵呵~~');
}
复制代码
只输出后面的:
box.onclick = function () {
console.log('哈哈哈~~');
//=>移除事件绑定:DOM0直接赋值为null便可
box.onclick = null;
}
复制代码
事件池特色:
- 基于addEventListener向事件池增长方法,存在去重的机制 “同一个元素,同一个事件类型,在事件池中只能存储一遍这个方法,不能重复存储”
box.addEventListener('click', function () {
console.log('哈哈哈~~');
}, false);
box.addEventListener('click', function () {
console.log('呵呵呵~~');
}, false);
复制代码
两个都能输出:
function fn1(){ console.log(1); }
function fn2(){ console.log(2); }
function fn3(){ console.log(3); }
box.addEventListener('click', fn2, false);
box.addEventListener('click', fn3, false);
box.addEventListener('click', fn1, false);
//=>基于addEventListener向事件池增长方法,存在去重的机制 “同一个元素,同一个事件类型,在事件池中只能存储一遍这个方法,不能重复存储”
box.addEventListener('click', fn1, false); // 因此此步跳过,再也不存储
box.addEventListener('mouseover', fn1, false);
复制代码
function fn() {
console.log('哈哈哈~~');
//=>移除事件绑定:从事件池中移除,因此须要指定好事件类型、方法等信息(要和绑定的时候同样才能够移除)
box.removeEventListener('click', fn, false);
}
box.addEventListener('click', fn, false);
复制代码
box.addEventListener('click', function () {
console.log('哔咔哔咔~~');
});
box.onclick = function () {
console.log('哇咔咔~~');
}
box.addEventListener('click', function () {
console.log('call~~');
});
复制代码
box.style.transition = 'opacity 1s';
box.ontransitionend = function () {
console.log('哇咔咔~~');
}
box.addEventListener('transitionend', function () {
console.log('哇咔咔~~');
});
window.addEventListener('load', function () {
//=>全部资源都加载完成触发
console.log('LOAD');
});
window.addEventListener('DOMContentLoaded', function () {
//=>只要DOM结构加载完就会触发
console.log('DOMContentLoaded');
});
//=>$(document).ready(function(){})
$(function () {
//=>JQ中的这个处理(DOM结构加载完触发)采用的就是DOMContentLoaded事件,而且依托DOM2事件绑定来处理,因此同一个页面中,此操做能够被使用屡次
});
/* JQ中的事件绑定采用的都是DOM2事件绑定,例如:on/off/one */
复制代码
window.onload
和 $(document).ready()
的区别DOMContentLoaded
这个事件,因此只要DOM结构加载完成就会被触发执行,window.addEventListener('load', function () {})
DOM2绑定方式事件对象是由事件当前自己产生的,和执行什么函数没有关系
事件对象和函数以及给谁绑定的事件没啥必然关系,它存储的是当前本次操做的相关信息,操做一次只能有一份信息,因此在哪一个方法中获取的信息都是同样的;第二次操做,存储的信息会把上一次操做存储的信息替换掉...;
若是是鼠标操做,获取的是MouseEvent类的实例(这个实例就是 =>鼠标事件对象)
box.onclick = function (ev) {
console.log(ev);
}
复制代码
若是是键盘操做,获取的是KeyboardEvent类的实例 =>键盘事件对象
window键盘码值:
这里不详细介绍了
除了上面,只有鼠标和键盘中有的属性外,还有一些公共的全部事件对象都有的属性
事件传播机制:当某个元素的相关事件行为触发时,浏览器会作三件事情:(能够经过dir(Event)产看Event类上的信息)
Event.prototype:Event 原型上记录了冒泡传播的顺序
一、捕获阶段:=>CAPTURING_PHASE:1
从最外层向最里层事件源依次进行查找
二、目标阶段:=>AT_TARGET:2
三、冒泡传播:=>BUBBLING_PHASE:3
ev.stopPropagation()
- 不兼容的浏览器中用ev.cancelBubble=true也能够阻止默认行为
效果图:
<div id="fd">
<div class="lit_box">
<div class="mask"></div>
<img src="images/banner1.jpg" alt="">
</div>
<div class="big_box">
<img src="images/banner1.jpg" alt="">
</div>
</div>
复制代码
#fd {
margin: 20px auto;
}
.lit_box {
width: 200px;
height: 200px;
border: 1px solid #333;
position: relative;
top: 0;
left: 0;
}
.lit_box img {
width: 100%;
height: 100%;
}
.lit_box .mask {
width: 100px;
height: 100px;
background: rgba(238, 132, 10, 0.8);
position: absolute;
top: 0;
left: 0;
display: none;
cursor: move;
}
.big_box {
width: 400px;
height: 400px;
border: 1px solid #333;
position: relative;
left: 210px;
top: -201px;
overflow: hidden;
display: none;
}
.big_box img {
position: absolute;
width: 800px;
height: 800px;
}
复制代码
let lit = document.querySelector('.lit_box'),
mask = document.querySelector('.mask'),
big = document.querySelector('.big_box'),
bigImg = big.querySelector('img');
lit.onmouseenter = function () {
mask.style.display = 'block';
big.style.display = 'block';
}
lit.onmouseleave = function () {
mask.style.display = 'none';
big.style.display = 'none';
}
lit.onmousemove = function (e) {
let o = offset(this);
let l = e.pageX - o.left - mask.clientWidth / 2,
t = e.pageY - o.top - mask.clientHeight / 2;
let maxL = this.clientWidth - mask.clientWidth,
maxT = this.clientHeight - mask.clientHeight;
l = l < 0 ? 0 : (l > maxL ? maxL : l);
t = t < 0 ? 0 : (t > maxT ? maxT : t);
mask.style.left = l + 'px';
mask.style.top = t + 'px';
let n = big.clientHeight / mask.clientHeight;
bigImg.style.left = -l * n + 'px';
bigImg.style.top = -t * n + 'px';
}
function offset(ele) {
let l = ele.offsetLeft,
t = ele.offsetTop;
let parent = ele.offsetParent;
while (parent) {
l += parent.clientLeft + parent.offsetLeft;
t += parent.clientTop + parent.offsetTop;
parent = parent.offsetParent;
}
return {
top: t,
left: l
}
}
复制代码
又叫作事件代理
若是一个容器中不少元素都要在触发某一事件的时候作一些事情的时候,
数据是动态绑定渲染的,要给每一条数据绑定事件行为时,选用事件委托,就能够实现动态点击的处理了,不用在逐一获取绑定了
除某某事件源之外的其它事件源,操做的时候统一作某事的,基本上都要基于事件委托解决