文章目錄
- 注冊事件(綁定事件)
- 注冊事件概述
- addEventListener 事件監聽方式
- attachEvent 事件監聽方式
- 注冊事件相容性解決方案
- 删除事件(解綁事件)
- 删除事件的方式
- 删除事件相容性解決方案
注冊事件(綁定事件)
注冊事件概述
給元素添加事件,稱為注冊事件或者綁定事件。
注冊事件有兩種方式:
- 傳統方式
- 方法監聽注冊方式
①傳統注冊方式
- 利用 on 開頭的事件 onclick
- <button οnclick=“alert(‘hi~’)”></button>
- btn.onclick = function() {}
- 特點: 注冊事件的唯一性
- 同一個元素同一個事件隻能設定一個處理函數,最後注冊的處理函數将會覆寫前面注冊的處理函數
②方法監聽注冊方式
- w3c 标準 推薦方式
- addEventListener() 它是一個方法
- IE9 之前的 IE 不支援此方法,可使用 attachEvent() 代替
- 特點:同一個元素同一個事件可以注冊多個監聽器
- 按注冊順序依次執行
addEventListener 事件監聽方式
文法:
eventTarget.addEventListener(type, listener[, useCapture])
eventTarget.addEventListener()方法将指定的監聽器注冊到 eventTarget(目标對象)上,當該對象觸發指定的事件時,就會執行事件處理函數。
該方法接收三個參數:
- type:事件類型字元串,比如 click 、mouseover ,注意這裡不要帶on
- listener:事件處理函數,事件發生時,會調用該監聽函數
- useCapture:可選參數,是一個布爾值,預設是 false。
例如:
<script>
var btns = document.querySelectorAll('button');
// 事件偵聽注冊事件 addEventListener
// (1) 裡面的事件類型是字元串 必定加引号 而且不帶on
// (2) 同一個元素 同一個事件可以添加多個偵聽器(事件處理程式)
btns[1].addEventListener('click', function() {
alert(22);
})
btns[1].addEventListener('click', function() {
alert(33);
})
// 3. attachEvent ie9以前的版本支援
btns[2].attachEvent('onclick', function() {
alert(11);
})
</script>
attachEvent 事件監聽方式
eventTarget.attachEvent(eventNameWithOn, callback)
eventTarget.attachEvent()方法将指定的監聽器注冊到 eventTarget(目标對象) 上,當該對象觸發指定的事件時,指定的回調函數就會被執行。
該方法接收兩個參數:
- eventNameWithOn:事件類型字元串,比如 onclick 、onmouseover ,這裡要帶 on
- callback: 事件處理函數,當目标觸發事件時回調函數被調用
注意:IE8 及早期版本支援
例如:
[2].attachEvent('onclick', function() {
alert(11);
})
注冊事件相容性解決方案
function addEventListener(element, eventName,) {
// 判斷目前浏覽器是否支援 addEventListener 方法
if (element.addEventListener) {
element.addEventListener(eventName, fn); // 第三個參數 預設是false
} else if (element.attachEvent) {
element.attachEvent('on' + eventName, fn);
} else {
// 相當于 element.onclick = fn;
element['on' + eventName] = fn;
}
相容性處理的原則: 首先照顧大多數浏覽器,再處理特殊浏覽器
删除事件(解綁事件)
删除事件的方式
- 傳統注冊方式
eventTarget.onclick = null;
- 方法監聽注冊方式
① eventTarget.removeEventListener(type, listener[, useCapture]);
② eventTarget.detachEvent(eventNameWithOn, callback);
<body>
<div>1</div>
<div>2</div>
<div>3</div>
<script>
var divs = document.querySelectorAll('div');
divs[0].onclick = function() {
alert(11);
// 1. 傳統方式删除事件
divs[0].onclick = null;
}
// 2. removeEventListener 删除事件
divs[1].addEventListener('click', fn) // 裡面的fn 不需要調用加小括号
function fn() {
alert(22);
divs[1].removeEventListener('click', fn);
}
// 3. detachEvent
divs[2].attachEvent('onclick', fn1);
function fn1() {
alert(33);
divs[2].detachEvent('onclick', fn1);
}
</script>
</body>
删除事件相容性解決方案
function removeEventListener(element, eventName,) {
// 判斷目前浏覽器是否支援 removeEventListener 方法
if (element.removeEventListener) {
element.removeEventListener(eventName, fn); // 第三個參數 預設是false
} else if (element.detachEvent) {
element.detachEvent('on' + eventName, fn);
} else {
element['on' + eventName] = null;
}