Skip to content

Commit 360faf1

Browse files
jkzingaJean
authored andcommitted
fix: support KeyboardEvent.key in built-in keyboard event modifiers (vuejs#7121)
fix vuejs#6900
1 parent c50d2f6 commit 360faf1

File tree

2 files changed

+54
-6
lines changed

2 files changed

+54
-6
lines changed

src/core/instance/render-helpers/check-keycodes.js

+25-6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,26 @@
33
import config from 'core/config'
44
import { hyphenate } from 'shared/util'
55

6+
const keyNames: { [key: string]: string | Array<string> } = {
7+
esc: 'Escape',
8+
tab: 'Tab',
9+
enter: 'Enter',
10+
space: ' ',
11+
up: 'ArrowUp',
12+
left: 'ArrowLeft',
13+
right: 'ArrowRight',
14+
down: 'ArrowDown',
15+
'delete': ['Backspace', 'Delete']
16+
}
17+
18+
function isKeyNotMatch<T> (expect: T | Array<T>, actual: T): boolean {
19+
if (Array.isArray(expect)) {
20+
return expect.indexOf(actual) === -1
21+
} else {
22+
return expect !== actual
23+
}
24+
}
25+
626
/**
727
* Runtime helper for checking keyCodes from config.
828
* exposed as Vue.prototype._k
@@ -15,12 +35,11 @@ export function checkKeyCodes (
1535
eventKeyName?: string
1636
): ?boolean {
1737
const keyCodes = config.keyCodes[key] || builtInAlias
18-
if (keyCodes) {
19-
if (Array.isArray(keyCodes)) {
20-
return keyCodes.indexOf(eventKeyCode) === -1
21-
} else {
22-
return keyCodes !== eventKeyCode
23-
}
38+
const builtInName: string | Array<string> = keyNames[key]
39+
if (builtInName && keyCodes === builtInAlias && eventKeyName) {
40+
return isKeyNotMatch(builtInName, eventKeyName)
41+
} else if (keyCodes) {
42+
return isKeyNotMatch(keyCodes, eventKeyCode)
2443
} else if (eventKeyName) {
2544
return hyphenate(eventKeyName) !== key
2645
}

test/unit/features/directives/on.spec.js

+29
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,35 @@ describe('Directive v-on', () => {
362362
expect(spyMiddle).toHaveBeenCalled()
363363
})
364364

365+
it('should support KeyboardEvent.key for built in aliases', () => {
366+
vm = new Vue({
367+
el,
368+
template: `
369+
<div>
370+
<input ref="enter" @keyup.enter="foo">
371+
<input ref="space" @keyup.space="foo">
372+
<input ref="esc" @keyup.esc="foo">
373+
<input ref="left" @keyup.left="foo">
374+
<input ref="delete" @keyup.delete="foo">
375+
</div>
376+
`,
377+
methods: { foo: spy }
378+
})
379+
380+
triggerEvent(vm.$refs.enter, 'keyup', e => { e.key = 'Enter' })
381+
expect(spy.calls.count()).toBe(1)
382+
triggerEvent(vm.$refs.space, 'keyup', e => { e.key = ' ' })
383+
expect(spy.calls.count()).toBe(2)
384+
triggerEvent(vm.$refs.esc, 'keyup', e => { e.key = 'Escape' })
385+
expect(spy.calls.count()).toBe(3)
386+
triggerEvent(vm.$refs.left, 'keyup', e => { e.key = 'ArrowLeft' })
387+
expect(spy.calls.count()).toBe(4)
388+
triggerEvent(vm.$refs.delete, 'keyup', e => { e.key = 'Backspace' })
389+
expect(spy.calls.count()).toBe(5)
390+
triggerEvent(vm.$refs.delete, 'keyup', e => { e.key = 'Delete' })
391+
expect(spy.calls.count()).toBe(6)
392+
})
393+
365394
it('should support custom keyCode', () => {
366395
Vue.config.keyCodes.test = 1
367396
vm = new Vue({

0 commit comments

Comments
 (0)