摘要 js和jq的event對象大同小異,本文簡單對比下它們的'click'事件下的不一樣和應用jquery
代碼測試:工具
?測試
1
2
3
4
5
6
7
|
<div id=
"test"
><p>test text<p></div>
<script src=
"vendor/jquery-2.1.1.js"
></script>
<script>
test.addEventListener(
'click'
, function(e){console.log(e);},
false
),
$(
'#test'
).on(
'click'
, function(e){console.log(e)});
</script>
|
結果分析:this
?spa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
js-jq-event-common:{
altKey:
false
,
bubbles:
true
,
button:
0
,
cancelable:
true
,
clientX:
58
,
clientY:
13
,
ctrlKey:
false
,
offsetX:
50
,
offsetY:
5
,
pageX:
58
,
pageY:
13
,
screenX:
58
,
screenY:
122
,
view: Window,
which:
1
,
type:
'click'
,
timeStamp:
1407761742842
,
metaKey:
false
,
relatedTarget:
null
,
target: div#test
/*jq-evt的target不必定是jQuery選擇器匹配的元素,多是第一個捕獲事件的元素,而後向上冒泡時其中一個纔是選擇器匹配的元素*/
},
js-jq-event-diff:{
currentTarget:
null
/*貌似通常都爲null*/
|| div#test
/*jq選擇器匹配的元素在[currentTarget]屬性*/
,
eventPhase:
0
||
2
,
toElement: div#test
},
js-event-solo:{
x:
58
,
y:
13
,
cancelBubble:
false
,
charCode:
0
,
clipboardData: undefined,
dataTransfer:
null
,
defaultPrevented:
false
,
srcElement: div#test,
fromElement:
null
,
detail:
1
,
keyCode:
0
,
layerX:
58
,
layerY:
13
,
returnValue:
true
},
jq-event-solo: {
buttons: undefined,
data: undefined,
delegateTarget: div#test
/*誰在監聽?就是這個元素啦。*/
,
isDefaultPrevented: function,
handleObj: Object,
jQuery211024030584539286792:
true
,
originalEvent: MouseEvent,
shiftKey:
false
}
body-click-delegate-event: {
currentTarget: HTMLBodyElement,
delegateTarget: HTMLBodyElement,
target: HTMLDivElement
}
|
總結:.net
js的event參數中,無論是target
, toElement
, srcElement
都是指向第一個觸發事件的元素(還沒冒泡),而fromElement
在click事件中爲null,因此,你若是是設置包含不少元素的父容器parent事件,那麼觸發事件的極可能是這個parent的子元素。
所以,在實際應用中,若是要引用parent,那你只能使用this
了code
jq的event參數中,對象
currentTarget
是匹配你選擇器的元素,就是你的所要元素;blog
delegateTarget
是在監聽事件的元素,屬於被委託的元素
target
同js的event參數裏的target
,是第一個觸發事件的元素,沒currentTarget
有用(也不必定,好比在bodyclick事件中的應用)
有同窗可能說,你要直接引用被設備事件的元素用this
就得啦,何須理解currentTarget
和target
呢。這個想法證實你還只是用下jQuery而已,沒用過相似Backbone之類的工具。
Backbone不少地方綁定了this
,因此在它的函數中用this
是不行的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
var view = Backbone.View.extend({
el: document.body,
events: {
'click p'
:
'showText'
// 委託body監聽p的click事件
},
showText: function(e){
var p = e.currentTarget;
// [currentTarget]獲取選擇器匹配的元素
this
.log(p.innerHTML);
// 看到了吧,this並不指向p元素
},
log: function(msg){
console.log(msg);
}
});
|