Skip to content

Commit 4317393

Browse files
committed
compiler & v-on: backport modifier changes
1 parent bdc7c94 commit 4317393

File tree

2 files changed

+67
-34
lines changed

2 files changed

+67
-34
lines changed

src/directive.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ var textParser = require('./parsers/text')
55
var expParser = require('./parsers/expression')
66
function noop () {}
77

8+
var modifierRE = /\.[^\.]+/g
9+
810
/**
911
* A directive links a DOM element with a piece of data,
1012
* which is the result of evaluating an expression.
@@ -35,6 +37,13 @@ function Directive (name, el, vm, descriptor, def, host, scope, frag, arg, liter
3537
// copy descriptor props
3638
this.expression = descriptor.expression
3739
this.arg = arg || descriptor.arg
40+
41+
// patch: modifiers
42+
if (typeof this.arg === 'string') {
43+
this.modifiers = parseModifiers(this.arg)
44+
this.arg = this.arg.replace(modifierRE, '')
45+
}
46+
3847
this.filters = descriptor.filters
3948
// private
4049
this._def = def
@@ -318,4 +327,23 @@ function removeBindAttr (el, name) {
318327
}
319328
}
320329

330+
/**
331+
* Parse modifiers from directive attribute name.
332+
*
333+
* @param {String} name
334+
* @return {Object}
335+
*/
336+
337+
function parseModifiers (name) {
338+
var res = Object.create(null)
339+
var match = name.match(modifierRE)
340+
if (match) {
341+
var i = match.length
342+
while (i--) {
343+
res[match[i].slice(1)] = true
344+
}
345+
}
346+
return res
347+
}
348+
321349
module.exports = Directive

src/directives/on.js

Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,42 @@
11
var _ = require('../util')
2-
var keyFilter = require('../filters').key
32

4-
// modifiers
5-
var stopRE = /\.stop\b/
6-
var preventRE = /\.prevent\b/
3+
// keyCode aliases
4+
var keyCodes = {
5+
esc: 27,
6+
tab: 9,
7+
enter: 13,
8+
space: 32,
9+
'delete': 46,
10+
up: 38,
11+
left: 37,
12+
right: 39,
13+
down: 40
14+
}
15+
16+
function keyFilter (handler, keys) {
17+
var codes = keys.map(function (key) {
18+
var code = keyCodes[key]
19+
if (!code) {
20+
code = parseInt(key, 10)
21+
}
22+
return code
23+
})
24+
return function keyHandler (e) {
25+
if (codes.indexOf(e.keyCode) > -1) {
26+
return handler.call(this, e)
27+
}
28+
}
29+
}
730

831
function stopFilter (handler) {
9-
return function (e) {
32+
return function stopHandler (e) {
1033
e.stopPropagation()
1134
return handler.call(this, e)
1235
}
1336
}
1437

1538
function preventFilter (handler) {
16-
return function (e) {
39+
return function preventHandler (e) {
1740
e.preventDefault()
1841
return handler.call(this, e)
1942
}
@@ -37,29 +60,6 @@ module.exports = {
3760
}
3861
}
3962

40-
var event = this.arg
41-
42-
// stop modifier
43-
if (stopRE.test(event)) {
44-
this.stop = true
45-
event = event.replace(stopRE, '')
46-
}
47-
48-
// prevent modifier
49-
if (preventRE.test(event)) {
50-
this.prevent = true
51-
event = event.replace(preventRE, '')
52-
}
53-
54-
// key modifier
55-
var keyIndex = event.indexOf('.')
56-
if (keyIndex > -1) {
57-
this.arg = event.slice(0, keyIndex)
58-
this.key = event.slice(keyIndex + 1)
59-
} else {
60-
this.arg = event
61-
}
62-
6363
// deal with iframes
6464
if (
6565
this.el.tagName === 'IFRAME' &&
@@ -76,22 +76,27 @@ module.exports = {
7676
update: function (handler) {
7777
if (typeof handler !== 'function') {
7878
process.env.NODE_ENV !== 'production' && _.warn(
79-
'Directive v-on="' + this.arg + ': ' +
79+
'v-on:' + this.arg + '="' +
8080
this.expression + '" expects a function value, ' +
8181
'got ' + handler
8282
)
8383
return
8484
}
8585

8686
// apply modifiers
87-
if (this.stop) {
87+
if (this.modifiers.stop) {
8888
handler = stopFilter(handler)
8989
}
90-
if (this.prevent) {
90+
if (this.modifiers.prevent) {
9191
handler = preventFilter(handler)
9292
}
93-
if (this.key) {
94-
handler = keyFilter(handler, this.key)
93+
// key filter
94+
var keys = Object.keys(this.modifiers)
95+
.filter(function (key) {
96+
return key !== 'stop' && key !== 'prevent'
97+
})
98+
if (keys.length) {
99+
handler = keyFilter(handler, keys)
95100
}
96101

97102
this.reset()

0 commit comments

Comments
 (0)