File tree Expand file tree Collapse file tree 4 files changed +62
-6
lines changed
test/unit/specs/directives/public Expand file tree Collapse file tree 4 files changed +62
-6
lines changed Original file line number Diff line number Diff line change @@ -288,10 +288,11 @@ Directive.prototype._withLock = function (fn) {
288
288
*
289
289
* @param {String } event
290
290
* @param {Function } handler
291
+ * @param {Boolean } [useCapture]
291
292
*/
292
293
293
- Directive . prototype . on = function ( event , handler ) {
294
- on ( this . el , event , handler )
294
+ Directive . prototype . on = function ( event , handler , useCapture ) {
295
+ on ( this . el , event , handler , useCapture )
295
296
; ( this . _listeners || ( this . _listeners = [ ] ) )
296
297
. push ( [ event , handler ] )
297
298
}
Original file line number Diff line number Diff line change @@ -50,6 +50,14 @@ function preventFilter (handler) {
50
50
}
51
51
}
52
52
53
+ function selfFilter ( handler ) {
54
+ return function selfHandler ( e ) {
55
+ if ( e . target === e . currentTarget ) {
56
+ return handler . call ( this , e )
57
+ }
58
+ }
59
+ }
60
+
53
61
export default {
54
62
55
63
acceptStatement : true ,
@@ -63,7 +71,12 @@ export default {
63
71
) {
64
72
var self = this
65
73
this . iframeBind = function ( ) {
66
- on ( self . el . contentWindow , self . arg , self . handler )
74
+ on (
75
+ self . el . contentWindow ,
76
+ self . arg ,
77
+ self . handler ,
78
+ self . modifiers . capture
79
+ )
67
80
}
68
81
this . on ( 'load' , this . iframeBind )
69
82
}
@@ -92,6 +105,9 @@ export default {
92
105
if ( this . modifiers . prevent ) {
93
106
handler = preventFilter ( handler )
94
107
}
108
+ if ( this . modifiers . self ) {
109
+ handler = selfFilter ( handler )
110
+ }
95
111
// key filter
96
112
var keys = Object . keys ( this . modifiers )
97
113
. filter ( function ( key ) {
@@ -107,7 +123,12 @@ export default {
107
123
if ( this . iframeBind ) {
108
124
this . iframeBind ( )
109
125
} else {
110
- on ( this . el , this . arg , this . handler )
126
+ on (
127
+ this . el ,
128
+ this . arg ,
129
+ this . handler ,
130
+ this . modifiers . capture
131
+ )
111
132
}
112
133
} ,
113
134
Original file line number Diff line number Diff line change @@ -160,10 +160,11 @@ export function replace (target, el) {
160
160
* @param {Element } el
161
161
* @param {String } event
162
162
* @param {Function } cb
163
+ * @param {Boolean } [useCapture]
163
164
*/
164
165
165
- export function on ( el , event , cb ) {
166
- el . addEventListener ( event , cb )
166
+ export function on ( el , event , cb , useCapture ) {
167
+ el . addEventListener ( event , cb , useCapture )
167
168
}
168
169
169
170
/**
Original file line number Diff line number Diff line change @@ -216,6 +216,39 @@ describe('v-on', function () {
216
216
expect ( window . location . hash ) . toBe ( hash )
217
217
} )
218
218
219
+ it ( 'capture modifier' , function ( ) {
220
+ document . body . appendChild ( el )
221
+ var outer = jasmine . createSpy ( 'outer' )
222
+ var inner = jasmine . createSpy ( 'inner' )
223
+ new Vue ( {
224
+ el : el ,
225
+ template : '<div @click.capture.stop="outer"><div class="inner" @click="inner"></div></div>' ,
226
+ methods : {
227
+ outer : outer ,
228
+ inner : inner
229
+ }
230
+ } )
231
+ trigger ( el . querySelector ( '.inner' ) , 'click' )
232
+ expect ( outer ) . toHaveBeenCalled ( )
233
+ expect ( inner ) . not . toHaveBeenCalled ( )
234
+ document . body . removeChild ( el )
235
+ } )
236
+
237
+ it ( 'self modifier' , function ( ) {
238
+ var outer = jasmine . createSpy ( 'outer' )
239
+ new Vue ( {
240
+ el : el ,
241
+ template : '<div class="outer" @click.self="outer"><div class="inner"></div></div>' ,
242
+ methods : {
243
+ outer : outer
244
+ }
245
+ } )
246
+ trigger ( el . querySelector ( '.inner' ) , 'click' )
247
+ expect ( outer ) . not . toHaveBeenCalled ( )
248
+ trigger ( el . querySelector ( '.outer' ) , 'click' )
249
+ expect ( outer ) . toHaveBeenCalled ( )
250
+ } )
251
+
219
252
it ( 'multiple modifiers working together' , function ( ) {
220
253
var outer = jasmine . createSpy ( 'outer' )
221
254
var prevented
You can’t perform that action at this time.
0 commit comments