天天看點

java 禁止 事件_JavaScript基本處理事件詳解和阻止事件傳播

解決方案

以上我們介紹過 W3C DOM Leaval 2事件綁定中的addEventlistener,可以為元素添加多個事件,而且最後一個參數還支援事件冒泡或捕獲,IE6/7/8仍然沒有遵循标準而使用了自己專有的attachEvent,且不支援事件捕獲,所有事件都是發生在冒泡階段。

是以建立一個可重用。實作了DOM Leavl 2事件處理的事件處理函數,但是,它還是要跨浏覽器。如下經典代碼listenEvent函數代碼functionlistenEvent(eventTarget,eventType,evrntHandler) { if (eventTarget.addEventListener){eventTarget.addEventListener(eventType,evrntHandler, true);//IE9等其他現代浏覽器 } else if (eventTarget.attachEvent){eventType= "on"+eventType;eventTarget.attachEvent(eventType,evrntHandler) //IE6、7、8 } else {eventTarget["on" +eventType] =evrntHandler;}//IE5~ 個人覺得不寫也罷。}

listenEvent函數使用listenEvent(document,"click",processClick)可重用的事件處理函數

此處理函數接受3個函數:目标對象、事件(作為一個字元串),以及函數名稱。首先測試對象,看看它是否支援addEventListener(W3C DOM Leaval 2的事件監聽方法),如果支援這個方法,就把事件映射到事件處理函數。回到代碼,因為IE6、7、8不支援addEventListener,是以檢查是否支援attachEvent,記得前面加”on“,因為不加”on“隻是事件的名字,但是因為IE6、7、8隻支援向上冒泡,是以此方案中 addEventListener的第三個參數是false。最後為了相容DOM leaval 0事件處理,還要加最後一行代碼。

使用W3C DOM Leavl 2處理事件事件監聽不會有覆寫之前綁定事件的現象,每個綁定的事件都會被執行,不過 attachEvent 為元素增加的一系列事件不是以添加它們順序執行的,而是以相反的順序觸發。最重要的是,采用事件監聽給對象綁定方法後,可以解除相應的綁定。跟以上代碼類似,removeEventListener跟addEventListener對應,detachEvent跟eventType對應,得到如下解決方案:stopListening函數代碼functionstopListening(eventTarget,eventType,evrntHandler) { if (eventTarget.removeEventListener){eventTarget.removeEventListener(eventType,evrntHandler, true);//IE9等其他現代浏覽器 } else if (eventTarget.attachEvent){detachEvent= "on"+eventType;eventTarget.detachEvent(eventType,evrntHandler) //IE6、7、8 } else {eventTarget["on" +eventType] = null;}//IE5~}stopListening(document,"click",processClick)可重用的事件處理函數

在DOM标準的事件解除安裝方式中需要注意的是:事件捕獲的參數。如果你的事件是注冊在捕獲階段,則解除安裝事件時,必須将其指定為捕獲階段(true),否則無法解除安裝;如果你的事件注冊在注冊在冒泡階段,則必須将其指定為冒泡階段(false),否則同樣無法解除安裝。

現在,如果我們想停止監聽一個事件,可以直接調用stopListening,同樣傳入3個參數:目标對象、事件和事件處理函數。