js06 js事件 事件委託 冒泡和捕獲!

2021-08-21 18:43:08 字數 4343 閱讀 1518

對於文件嵌入內容不是很清楚的同學可以去看一下html5權威指南的第15章節內容。

"text" id=

"test"

>

<

/body>

/* 雖然id可以直接拿來使用,但是並不提倡,這不符合規範! */

test.

onkeypress

=function

(event)

;<

/script>

在我依次按下數字鍵1、2、3、4、5、6時控制台是如下效果:

index.html:15    49

index.html:16

index.html:15 50

index.html:16 1

index.html:15 51

index.html:16 12

index.html:15 52

index.html:16 123

index.html:15 53

index.html:16 1234

index.html:15 54

index.html:16 12345

但是如果是keyup的事件呢:

在我依次按下數字鍵1、2、3、4、5、6時控制台是如下效果:

index.html:15    49

index.html:16 1

index.html:15 50

index.html:16 12

index.html:15 51

index.html:16 123

index.html:15 52

index.html:16 1234

index.html:15 53

index.html:16 12345

index.html:15 54

index.html:16 123456

根據網頁文件的dom級別規定層級結構:

文件結構

document

html

body

element

假定事件在element上觸發,然後事件會跟著下圖一次冒泡

graph lr

element-->body

body-->html

html-->document

事件是預設冒泡的,在ie9,opera9.5及其他瀏覽器各版本及更高版本都是支援事件流的,但是上述明確瀏覽器的更低版本則不支援。

控制台輸出的結果:

index.html:29   

index.html:26 …

index.html:23 …

index.html:20 #document

index.html:17 window

如果我們把this全**tostring方法改為字串!

index.html:29    [object htmldivelement]

index.html:26 [object htmlbodyelement]

index.html:23 [object htmlhtmlelement]

index.html:20 [object htmldocument]

index.html:17 [object window]

同事件冒泡正好相反,它會按照事件流向下級結構傳遞:

graph lr

document-->html

html-->body

body-->element

而控制他們事件流傳遞方向的建立事件監聽時的乙個引數,後面我再詳細解釋。

testelement.

addeventlistener

("click"

,function

(event)

,false);

/*index.html:32

index.html:33 click

*/

它的第三個引數預設為false,代表預設使用事件冒泡規則,同時事件會根據冒泡規則一次向上傳遞,如果改為true則事件採用事件捕獲規則,根據文件結構和元素關係進行事件的向下傳遞。

testelement.

removeeventlistener

("click"

,function

(event)

,false

);

但是我們要注意的地方是,事件移除程式移除的是第二引數傳遞進去的函式,如果是函式體,會因為指向問題使移除監聽並不算成功,而我們如果傳遞進去的是函式名的話,則能很好的達到效果!沒聽懂,沒關係,看下面:

testelement.

addeventlistener

("click"

,function

(event)

,false);

testelement.

removeeventlistener

("click"

,function

(event)

,false);

/*index.html:32

index.html:33 click

*/

沒錯,remove裡的沒有執行,但是add裡的卻仍然很好的執行了!那我們來看正確的方式!

testelement.

addeventlistener

("click"

, handler,

false);

testelement.

removeeventlistener

("click"

, handler,

false);

function

handler

(event)

/*控制台你什麼也不會看到!

*/

究其原因,是因為上面的建立和移除是各自建立的函式,它們看起來很像,但是根本沒有絲毫"血緣"關係,它們在記憶體中佔據了兩個不同的位置,而後面引用的函式名確實代表的同乙個"東西",它們指向的是記憶體中的同乙個位置!!!

/*index.html:29

index.html:30 click

*/

如果要測試事件捕獲需要用規範的建立事件監聽,並使第三個引數改為true就可以了!

var eventutil =

else

if(ele.attachevent)

else},

removehandler:

function

(ele, type, handler)

else

if(ele.detachevent)

else},

getevent:

function

(event)

, gettarget:

function

(event)

, preventdefault:

function

(event)

else

}, stoppropagation:

function

(event)

else}}

;//比如建立乙個鍵盤監聽事件

eventutil.

addhandler

(document,

"keyup"

,function

(event)

);

/*

事件處理程式建立了乙個鍵盤監聽事件,通過eventutil物件的getevent獲取當前事件,然後通過event的特有屬性,

event.target獲取到事件觸發時的響應目標(直接獲取到元素物件!),然後通過引數等呼叫相應需要實現的函式

*/eventutil.

addhandler

(document,

"keyup"

,function

(event)

);

js事件冒泡和事件委託

js事件冒泡 js所謂的事件冒泡就是子級元素的某個事件被觸發,它的上級元素的該事件也被遞迴執行 html js ul data type citypick on click function ul data type citypick on click li function 當li的點選事件被觸發...

JS基礎 事件 事件委託

我們都知道,在js中,新增到頁面上的處理程式數量將直接影響到整體執行效能。因為事件的執行會一直占用記憶體,因此當事件的數量達到一定的程度之後,就會嚴重影響程式的效能,一種提公升效能的方式就是使用事件委託 事件委託利用了事件冒泡,只指定乙個事件處理程式,就可以管理某一型別的所有事件。適合使用事件委託的...

JS事件冒泡 事件捕獲和事件委託

如上圖所示 事件冒泡 結構上從內到外 如上圖所示 事件捕獲 結構上從外到內 使用addeventlistener 方法指定事件是否在捕獲或冒泡階段執行 element.addeventlistener event,function,usecapture usecapture 可選。布林值,指定事件是...