javascript原生的事件,總結了一下,包括事件流、處理函數、事件對象這幾樣東西。而在兼容性方面,主要是老牌ie8以及如下和現代瀏覽器的差別,也就是ie和DOM事件標準的差別。javascript
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <a href="##" id="a" style="display:block;width:100px;height:100px;background-color: #ccc;"></a> <script> document.getElementById('a').onclick = function(event){ event = event || window.event; alert(event); } </script> </body> </html>
c、DOM2事件綁定
主要指的是元素的addEventListener()和removeEventListener()。前者綁定,後者刪除。
這兩個函數都有三個參數,
第一個是事件類型,有click,focus,blur等
第二個是事件處理函數。
第三個是個布爾值,true表明在捕獲階段調用處理函數,false表明在冒泡階段調用處理函數。
要綁定事件:css
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<a href="##" id="a" style="display:block;width:100px;height:100px;background-color: #ccc;"></a>
<script> document.getElementById('a').addEventListener('click',function(event){ alert(event); },false) </script>
</body>
</html>
假如想解除綁定,有人可能會這樣:html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<a href="##" id="a" style="display:block;width:100px;height:100px;background-color: #ccc;"></a>
<script> document.getElementById('a').addEventListener('click',function(event){ alert(event); },false) document.getElementById('a').removeEventListener('click',function(event){ alert(event); },false) </script>
</body>
</html>
可是這樣是不會成功的。由於函數是一個對象,兩個匿名函數是不一樣的對象,不相等。因此匿名函數是沒辦法解綁的。只能想下面這個,個函數一個名號。java
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<a href="##" id="a" style="display:block;width:100px;height:100px;background-color: #ccc;"></a>
<script>
var handler = function(event){ alert(event); } document.getElementById('a').addEventListener('click',handler,false) document.getElementById('a').removeEventListener('click',handler,false) </script>
</body>
</html>
ie8-的瀏覽器不支持DOM2級事件,可是有相似的方法attachEvent()和detachEvent();用法上是同樣的,只是由於ie8-只有冒泡過程因此就沒有第三個參數。還有第一個參數要加個‘on’,好比click事件是‘onclick'。另外,函數內this指向window。jquery
事件對象
chrome
在js中全部的事件對象都繼承自Event。在chrome(左)和firefox(右)中Event對象的樣子。
能夠看到在瀏覽器中Event對象仍是有點區別的。可是下面的屬性和方法是公用的。瀏覽器
bubbles | 是否冒泡 |
cancelable | 是否能夠取消默認行爲 |
currentTarget | 目前元素 |
target | 目標元素 |
defaultPrevented | 是否已被阻止默認行爲 |
type | 事件類型 |
eventPhase | 事件流哪一個階段1捕獲 2目標 3冒泡 |
detail | 一些信息 |
trusted | js建立的爲false,瀏覽器建立爲true |
view | 等同於window |
preventDefault() | 阻止默認行爲 |
stopPropagation() | 阻止冒泡和捕獲 |
stopImmediatePropagation() | 當即阻止冒泡和捕獲 |
在ie8—中事件對象,是這個樣子:框架
cancelBubble | 是否取消冒泡,爲true先頂一下stopPropagation() |
returnValue | 返回值,爲false至關於preventDefault() |
srcElement | 目標元素,至關於target |
type | 事件類型 |
clientX、clientY | |
which | 一、左 二、右 三、中 |
detail | 單擊次數 |
ctrlKey | |
altKey | |
metaKey | |
shiftKey | |
pageX、pageY | |
screenX、screenY |
clientX、clientY | |
button | 0:沒按下,1:主鼠標,2:次鼠標,3:同時按下主次按鈕,4:中間按鈕,5:主和中間按鈕,6:按下次和右鼠標,7:三個都按下 |
offsetX、offsetY | |
ctrlKey | |
altKey | |
metaKey | |
shiftKey | |
fromElement | mouseover |
toElement | mouseout |
if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); }
用位與運算,把button的一、三、五、7修正爲1;2,6修正爲2;dom
charCode = event.charCode || event.keyCode