事件:是元素天生自帶的默認操做行爲,不論咱們是否給其綁定了方法,當咱們操做的時候,也會把對應的事件觸發;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
}
}
複製代碼
又叫作事件代理
若是一個容器中不少元素都要在觸發某一事件的時候作一些事情的時候,
數據是動態綁定渲染的,要給每一條數據綁定事件行爲時,選用事件委託,就能夠實現動態點擊的處理了,不用在逐一獲取綁定了
除某某事件源之外的其它事件源,操做的時候統一作某事的,基本上都要基於事件委託解決