Kaynağa Gözat

support mouse event modifier (#4866)

kingwl 9 yıl önce
ebeveyn
işleme
0e2dafa74c

+ 4 - 1
src/compiler/codegen/events.js

@@ -26,7 +26,10 @@ const modifierCode: { [key: string]: string } = {
   ctrl: 'if(!$event.ctrlKey)return null;',
   shift: 'if(!$event.shiftKey)return null;',
   alt: 'if(!$event.altKey)return null;',
-  meta: 'if(!$event.metaKey)return null;'
+  meta: 'if(!$event.metaKey)return null;',
+  left: 'if($event.button !== 0)return null;',
+  middle: 'if($event.button !== 1)return null;',
+  right: 'if($event.button !== 2)return null;'
 }
 
 export function genHandlers (events: ASTElementHandlers, native?: boolean): string {

+ 43 - 0
test/unit/features/directives/on.spec.js

@@ -212,6 +212,49 @@ describe('Directive v-on', () => {
     expect(spy).toHaveBeenCalled()
   })
 
+  it('should support mouse modifier', () => {
+    const left = 0
+    const middle = 1
+    const right = 2
+    const spyLeft = jasmine.createSpy()
+    const spyMiddle = jasmine.createSpy()
+    const spyRight = jasmine.createSpy()
+
+    vm = new Vue({
+      el,
+      template: `
+        <div>
+          <div ref="left" @mousedown.left="foo">left</div>
+          <div ref="right" @mousedown.right="foo1">right</div>
+          <div ref="middle" @mousedown.middle="foo2">right</div>
+        </div>
+      `,
+      methods: {
+        foo: spyLeft,
+        foo1: spyRight,
+        foo2: spyMiddle
+      }
+    })
+
+    triggerEvent(vm.$refs.left, 'mousedown', e => { e.button = right })
+    triggerEvent(vm.$refs.left, 'mousedown', e => { e.button = middle })
+    expect(spyLeft).not.toHaveBeenCalled()
+    triggerEvent(vm.$refs.left, 'mousedown', e => { e.button = left })
+    expect(spyLeft).toHaveBeenCalled()
+
+    triggerEvent(vm.$refs.right, 'mousedown', e => { e.button = left })
+    triggerEvent(vm.$refs.right, 'mousedown', e => { e.button = middle })
+    expect(spyRight).not.toHaveBeenCalled()
+    triggerEvent(vm.$refs.right, 'mousedown', e => { e.button = right })
+    expect(spyRight).toHaveBeenCalled()
+
+    triggerEvent(vm.$refs.middle, 'mousedown', e => { e.button = left })
+    triggerEvent(vm.$refs.middle, 'mousedown', e => { e.button = right })
+    expect(spyMiddle).not.toHaveBeenCalled()
+    triggerEvent(vm.$refs.middle, 'mousedown', e => { e.button = middle })
+    expect(spyMiddle).toHaveBeenCalled()
+  })
+
   it('should support custom keyCode', () => {
     Vue.config.keyCodes.test = 1
     vm = new Vue({