Skip to content

Commit 13ce3a2

Browse files
committed
fix v-on chained keyCodes (fix #3478)
1 parent ba5fb31 commit 13ce3a2

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed

src/compiler/codegen/events.js

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,25 +41,40 @@ function genHandler (
4141
? handler.value
4242
: `function($event){${handler.value}}`
4343
} else {
44-
let code = 'function($event){'
44+
let code = ''
45+
const keys = []
4546
for (const key in handler.modifiers) {
46-
code += modifierCode[key] || genKeyFilter(key)
47+
if (modifierCode[key]) {
48+
code += modifierCode[key]
49+
} else {
50+
keys.push(key)
51+
}
52+
}
53+
if (keys.length) {
54+
code = genKeyFilter(keys) + code
4755
}
4856
const handlerCode = simplePathRE.test(handler.value)
4957
? handler.value + '($event)'
5058
: handler.value
51-
return code + handlerCode + '}'
59+
return 'function($event){' + code + handlerCode + '}'
5260
}
5361
}
5462

55-
function genKeyFilter (key: string): string {
56-
const code =
57-
parseInt(key, 10) || // number keyCode
58-
keyCodes[key] || // built-in alias
59-
`_k(${JSON.stringify(key)})` // custom alias
63+
function genKeyFilter (keys: Array<string>): string {
64+
const code = keys.length === 1
65+
? normalizeKeyCode(keys[0])
66+
: Array.prototype.concat.apply([], keys.map(normalizeKeyCode))
6067
if (Array.isArray(code)) {
6168
return `if(${code.map(c => `$event.keyCode!==${c}`).join('&&')})return;`
6269
} else {
6370
return `if($event.keyCode!==${code})return;`
6471
}
6572
}
73+
74+
function normalizeKeyCode (key) {
75+
return (
76+
parseInt(key, 10) || // number keyCode
77+
keyCodes[key] || // built-in alias
78+
`_k(${JSON.stringify(key)})` // custom alias
79+
)
80+
}

test/unit/modules/compiler/codegen.spec.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ describe('codegen', () => {
191191
'<input @input.delete="onInput">',
192192
`with(this){return _h('input',{on:{"input":function($event){if($event.keyCode!==8&&$event.keyCode!==46)return;onInput($event)}}})}`
193193
)
194+
// multiple keycodes (chained)
195+
assertCodegen(
196+
'<input @keydown.enter.delete="onInput">',
197+
`with(this){return _h('input',{on:{"keydown":function($event){if($event.keyCode!==13&&$event.keyCode!==8&&$event.keyCode!==46)return;onInput($event)}}})}`
198+
)
194199
// number keycode
195200
assertCodegen(
196201
'<input @input.13="onInput">',

0 commit comments

Comments
 (0)