事件處理詳解

2022-05-14 09:57:38 字數 3641 閱讀 8852

之前做的多是手機端頁面,監聽事件也一直是 addeventlistener ,現代瀏覽器基本都支援addeventlistener ,除了萬惡的ie8及更低版本ie。雖說不用太管ie8了(個人愚見),但是還是有必要整理下之前相容性的處理方式

在html標籤中直接給屬性設定處理程式。html中加入了js**,因為需要行為、樣式、結構分離,這種方式現在已經淘汰,就不深入**了。

1

<

button

onclick

="alert('html事件處理!')"

>點我

button

>

通過元素物件的事件屬性來繫結處理程式。先看栗子

<

a href

=""class

="a1"

>快點選我!

a>

document.queryselector('.a1').onclick = function

()

先獲取到元素a,在給元素的點選事件屬性onclick繫結處理程式。

這種方式的特點:

1、簡單易用,相容性良好,基本所有瀏覽器都支援

2、只能繫結乙個處理程式,重複繫結會覆蓋。如果給a的onclick屬性再繫結乙個處理程式,那麼現在的這個就會被覆蓋掉

3、只會在冒泡階段觸發

取消繫結也非常簡單,直接設為null就可以了。

document.queryselector('.a1').onclick = null; //取消繫結

通過事件方法來繫結和解綁處理程式。同樣看個栗子

<

a href

=""class

="a2"

>點選我!

a>

document.queryselector('.a2').addeventlistener('click', function

(e),

false

) document.queryselector('.a2').addeventlistener('click', function

(e),

false)

addeventlistener(eventname,listener,usecapture) 方式可以為事件繫結處理程式,第乙個引數為事件型別(不帶on);第二個引數是處理程式;第三個引數可指定哪個階段觸發,false對應冒泡階段、true物件捕獲階段(預設false),部分低版本瀏覽器要求這個引數不能為空,所以最好還是帶上。

這種方式的特點:

1、可為同乙個事件繫結多個處理程式,會依次觸發。多次繫結同乙個處理程式,只會生效一次

2、可指定觸發的階段,捕獲階段或者冒泡階段

3、相容ie8 - 之外的其他瀏覽器

解綁的方式為:element.removeeventlistener(eventname,listener,usecapture);和繫結的用法一致

ie8- 有一套自己的事件處理方法

繫結:element.attachevent(eventnamewithon,listener)

解綁:element.detachevent(eventnamewithon,listener)

document.queryselector('.a2').attachevent('onclick', function

(e))

特點:1、事件型別帶on (eg:onclick)

2、只能在冒泡階段觸發

3、ie10 - ie5都支援該方法

兩種方式的差別在事件型別和第三個引數,所以可以做一些處理,封裝相容性處理的方式

//

通用方式

//繫結

function

addevent(targetelement,eventname,listener,usecapture)

else

if(targetelement.attachevent)

else

}//解綁

function

removeevent(targetelement,eventname,listener,usecapture)

else

if(targetelement.attachevent)

else

}

測試一下使用,在ie8及其他瀏覽器都可以正常使用。

addevent(document.queryselector('.a2'),'click',test,false

)

function

test(e)

不同的方式獲取event物件的方式也不同

attachevent繫結: 通過 window.event獲取event物件

其他方式(dom0和addeventlistener):處理函式傳參直接獲取

function

test(e)

attachevent繫結的方式,處理程式內部this指向window。想要獲取元素物件 可以通過 window.event.srcelement

其他方式的this指向觸發元素 。 同樣的也可以通過 event.target獲取

e = e || window.event;  //

event物件

var target = e.target || e.srcelement; //

觸發物件

通過event物件的方式取消預設行為:

event.preventdefault()    //其他瀏覽器

event.returnvalue = false //ie8-

dom0級繫結的 還可以直接 return false 來取消預設行為,所有瀏覽器都支援

event物件阻止傳播:

event.stoppropagation() //其他瀏覽器

event.cancelbubble = true //ie8 -

一般可以這樣寫

e.stoppropagation ? e.stoppropagation() : e.cancelbubble = true;  //

阻止傳播

e.preventdefault ? e.preventdefault() : e.returnvalue = false; //

取消預設行為

如果多個元素的處理程式類同,如果每個都繫結一次會很繁瑣和低效,這時可以利用冒泡的原理(他們都會冒泡到父元素)直接在父元素上繫結事件。即為事件委託

點選我1!

點選我2!

點選我3!

addevent(document.queryselector('.item-3'),'click',function

(e) })

本例中,想要實現點選按鈕輸出按鈕文字。如果給三個按鈕分別繫結事件會不會太傻。所以直接繫結了父元素,事件觸發時,判斷觸發物件是否是button標籤,如果是,則輸出文字。

Objective C 事件處理 詳解

ios 常見的事件處理有如下三種方式 1 通過 ibaction 繫結將控制項的特定事件繫結到控制器的指示,當控制項上發生此事件,將會觸發控制器對應的方法 2 在程式中為ui控制項的特定事件繫結事件 3 對於ui控制項的某些生命週期事件,直接委託給對應的委託物件處理 1 通過 ibaction 繫結...

UITouch事件處理過程詳解

3 uiresponder 內部提供了方法,處理不同型別的事件 2.處理事件的方法 處理觸控事件 1 void touchesbegan withevent 2 void touchesmoved withevent 3 void touchesended withevent 4 void touc...

Spring的Event事件處理使用詳解

spring中使用事件非常簡單,只需要以下的幾個步驟 public class userregisterevent extends public string getusername 定義傳送郵件和發放優惠券的監聽 component order 2 可以使用order指定順序,越小優先順序越高 p...