From e5a89398144051988ccdcd2170abf15307b7f9f6 Mon Sep 17 00:00:00 2001 From: kingwl Date: Thu, 9 Mar 2017 18:39:27 +0800 Subject: [PATCH 1/3] fix wrong order of generate modifier code --- src/compiler/codegen/events.js | 6 +++++- test/unit/modules/compiler/codegen.spec.js | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/compiler/codegen/events.js b/src/compiler/codegen/events.js index ce0ae2893b8..733dc6e5fb2 100644 --- a/src/compiler/codegen/events.js +++ b/src/compiler/codegen/events.js @@ -63,10 +63,11 @@ function genHandler ( : `function($event){${handler.value}}` // inline statement } else { let code = '' + let genModifierCode = '' const keys = [] for (const key in handler.modifiers) { if (modifierCode[key]) { - code += modifierCode[key] + genModifierCode += modifierCode[key] // left/right if (keyCodes[key]) { keys.push(key) @@ -78,6 +79,9 @@ function genHandler ( if (keys.length) { code += genKeyFilter(keys) } + if (genModifierCode) { + code += genModifierCode + } const handlerCode = isMethodPath ? handler.value + '($event)' : isFunctionExpression diff --git a/test/unit/modules/compiler/codegen.spec.js b/test/unit/modules/compiler/codegen.spec.js index 0fea71a0696..1884b8765e8 100644 --- a/test/unit/modules/compiler/codegen.spec.js +++ b/test/unit/modules/compiler/codegen.spec.js @@ -268,6 +268,14 @@ describe('codegen', () => { ) }) + // Github Issues #5146 + it('generate events with generic modifiers and keycode correct order', () => { + assertCodegen( + '', + `with(this){return _c('input',{on:{"keydown":function($event){if(!('button' in $event)&&_k($event.keyCode,"enter",13))return null;$event.preventDefault();onInput($event)}}})}` + ) + }) + it('generate events with mouse event modifiers', () => { assertCodegen( '', From 520906499580002704a594d85adfb121113bc908 Mon Sep 17 00:00:00 2001 From: kingwl Date: Thu, 9 Mar 2017 18:56:53 +0800 Subject: [PATCH 2/3] add unit test of #5146 --- test/unit/features/directives/on.spec.js | 21 +++++++++++++++++++++ test/unit/modules/compiler/codegen.spec.js | 5 +++++ 2 files changed, 26 insertions(+) diff --git a/test/unit/features/directives/on.spec.js b/test/unit/features/directives/on.spec.js index fd65b7eb40a..4479384e1dd 100644 --- a/test/unit/features/directives/on.spec.js +++ b/test/unit/features/directives/on.spec.js @@ -525,4 +525,25 @@ describe('Directive v-on', () => { expect(spyUp.calls.count()).toBe(1) expect(spyDown.calls.count()).toBe(1) }) + + // Github Issues #5146 + it('should only prevent when match keycode', () => { + let prevented = false + vm = new Vue({ + el, + template: ` + + `, + methods: { + foo ($event) { + prevented = $event.defaultPrevented + } + } + }) + + triggerEvent(vm.$refs.input, 'keydown', e => { e.keyCode = 32 }) + expect(prevented).toBe(false) + triggerEvent(vm.$refs.input, 'keydown', e => { e.keyCode = 13 }) + expect(prevented).toBe(true) + }) }) diff --git a/test/unit/modules/compiler/codegen.spec.js b/test/unit/modules/compiler/codegen.spec.js index 1884b8765e8..ba4374cbda1 100644 --- a/test/unit/modules/compiler/codegen.spec.js +++ b/test/unit/modules/compiler/codegen.spec.js @@ -274,6 +274,11 @@ describe('codegen', () => { '', `with(this){return _c('input',{on:{"keydown":function($event){if(!('button' in $event)&&_k($event.keyCode,"enter",13))return null;$event.preventDefault();onInput($event)}}})}` ) + + assertCodegen( + '', + `with(this){return _c('input',{on:{"keydown":function($event){if(!('button' in $event)&&_k($event.keyCode,"enter",13))return null;$event.stopPropagation();onInput($event)}}})}` + ) }) it('generate events with mouse event modifiers', () => { From ed9744b4d56fdc6b832929c3c601e838b383e428 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Thu, 9 Mar 2017 11:59:49 +0100 Subject: [PATCH 3/3] Update events.js --- src/compiler/codegen/events.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/compiler/codegen/events.js b/src/compiler/codegen/events.js index 733dc6e5fb2..a6cf166d528 100644 --- a/src/compiler/codegen/events.js +++ b/src/compiler/codegen/events.js @@ -79,6 +79,7 @@ function genHandler ( if (keys.length) { code += genKeyFilter(keys) } + // Make sure modifiers like prevent and stop get executed after key filtering if (genModifierCode) { code += genModifierCode }