1. 程式人生 > >js監聽事件方法addEventListener()相容非IE和attachEvent()相容IE

js監聽事件方法addEventListener()相容非IE和attachEvent()相容IE

Mozilla中:
addEventListener的使用方式:

target.addEventListener(type, listener, useCapture);

target: 文件節點、document、window 或 XMLHttpRequest。
type: 字串,事件名稱,不含“on”,比如“click”、“mouseover”、“keydown”等。
listener :實現了 EventListener 介面或者是 JavaScript 中的函式。
useCapture :是否使用捕捉,一般用 false 。例如:document.getElementById(“testText”).addEventListener(“keydown”, function (event) { alert(event.keyCode); }, false);

IE中:
target.attachEvent(type, listener);
target: 文件節點、document、window 或 XMLHttpRequest。
type: 字串,事件名稱,含“on”,比如“onclick”、“onmouseover”、“onkeydown”等。
listener :實現了 EventListener 介面或者是 JavaScript 中的函式。 例如:document.getElementById("txt").attachEvent("onclick",function(event){alert(event.keyCode);});

W3C 及 IE 同時支援移除指定的事件, 用途是移除設定的事件, 格式分別如下:

W3C格式:
removeEventListener(event,function,capture/bubble);

Windows IE的格式如下:

detachEvent(event,function);

JS的事件監聽機制
很久以前有個叫Netscape的姑娘,她制訂了Javascript的一套事件驅動機制(即事件捕獲)
後來又有一個叫“IE”的小子,這孩子比較傲氣,他認為“憑什麼我要依照你的規則走”,於是他又創造了一套自己的規則(事件冒泡)
再後來,有個叫W3C的媒婆,想撮合這兩個孩子,將他們的特點融合在了一起,這下,事件產生的順序變成:
事件從根節點開始,逐級派送到子節點,若節點綁定了事件動作,則執行動作,然後繼續走,這個階段稱為“捕獲階段(Capture)”;
執行完捕獲階段後,事件由子節點往根節點派送,若節點綁定了事件動作,則執行動作,然後繼續走,這個階段稱為“冒泡階段(Bubble)”。

善良的Netscape以及其姐妹們都接受了媒婆的建議,採用了新的事件規則,而驕傲固執的IE小子始終按照自己的規則執行。最終使得這成為困擾前端開發人員的相容性問題之一。那麼,怎麼繫結事件呢?

由於這兩派瀏覽器的差異,其繫結的方法也不一樣,其中,遵循標準的瀏覽器使用W3C定義的addEventListener函式繫結,函式定義如下:

function addEventListener(string eventFlag, function eventFunc, [bool useCapture=false])
eventFlag : 事件名稱,如click、mouseover…
eventFunc: 繫結到事件中執行的動作
useCapture: 指定是否繫結在捕獲階段,true為是,false為否,預設為true
在事件監聽流中可以使用event.stopPropagation()來阻止事件繼續往下流

IE中使用自有的attachEvent函式繫結時間,函式定義如下:
function attachEvent(string eventFlag, function eventFunc)
eventFlag: 事件名稱,但要加上on,如onclick、onmouseover…
eventFunc: 繫結到事件中執行的動作
在事件監聽流中可以使用window.event.cacenlBubble=false來阻止事件繼續往下流

總結:addEventListener(string eventFlag, function eventFunc, [bool useCapture=false]),針對ff,chrome,safari瀏覽器,false指冒泡階段,預設為true,指捕獲階段。不過一般我們都用false。

attachEvent(string eventFlag, function eventFunc),針對ie系列、還有opera瀏覽器,少了事件處理機制的引數,只指定事件型別(別忘了on)和觸發哪個函式。