diff --git a/examples/docs/en-US/date-picker.md b/examples/docs/en-US/date-picker.md index 532e1a5b1..76e19421c 100644 --- a/examples/docs/en-US/date-picker.md +++ b/examples/docs/en-US/date-picker.md @@ -307,3 +307,5 @@ Picking a date range is supported. | Event Name | Description | Parameters | |---------|--------|---------| | change | triggers when input value changes | formatted value | +| blur | triggers when input is blur | (event: Event) | +| focus | triggers when input is focus | (event: Event) | diff --git a/examples/docs/en-US/datetime-picker.md b/examples/docs/en-US/datetime-picker.md index d9291931c..1433ee3fe 100644 --- a/examples/docs/en-US/datetime-picker.md +++ b/examples/docs/en-US/datetime-picker.md @@ -254,9 +254,9 @@ Select date and time in one picker. | text | title of the shortcut | string | — | — | | onClick | callback function, triggers when the shortcut is clicked, with the `vm` as its parameter. You can change the picker value by emitting the `pick` event. Example: `vm.$emit('pick', new Date())`| function | — | — | - ### Events | Event Name | Description | Parameters | |---------|--------|---------| | change | triggers when input value changes | formatted value | - +| blur | triggers when input is blur | (event: Event) | +| focus | triggers when input is focus | (event: Event) | diff --git a/examples/docs/en-US/input-number.md b/examples/docs/en-US/input-number.md index 69bc688b9..7fdf5066c 100644 --- a/examples/docs/en-US/input-number.md +++ b/examples/docs/en-US/input-number.md @@ -140,4 +140,6 @@ Additional `large` and `small` sizes of the input box are available | Event Name | Description | Parameters | |----| ---- | -----| -|change | triggers when the value changes | value after change | \ No newline at end of file +|change | triggers when the value changes | value after change | +| blur | triggers when the icon inside Input is blur | (event: Event) | +| focus | triggers when the icon inside Input is focus | (event: Event) | diff --git a/examples/docs/en-US/time-picker.md b/examples/docs/en-US/time-picker.md index 6873514bc..951829bee 100644 --- a/examples/docs/en-US/time-picker.md +++ b/examples/docs/en-US/time-picker.md @@ -182,4 +182,5 @@ Can pick an arbitrary time range. | Event Name | Description | Parameters | |---------|--------|---------| | change | triggers when input value changes | formatted value | - +| blur | triggers when input is blur | (event: Event) | +| focus | triggers when input is focus | (event: Event) | diff --git a/examples/docs/zh-CN/date-picker.md b/examples/docs/zh-CN/date-picker.md index b87ffc942..8cd09b5e9 100644 --- a/examples/docs/zh-CN/date-picker.md +++ b/examples/docs/zh-CN/date-picker.md @@ -316,4 +316,5 @@ | 事件名称 | 说明 | 回调参数 | |---------|--------|---------| | change | 当 input 的值改变时触发,返回值和文本框一致 | 格式化后的值 | - +| blur | 当 input 失去焦点时触发 | (event: Event) | +| focus | 当 input 获得焦点时触发 | (event: Event) | diff --git a/examples/docs/zh-CN/datetime-picker.md b/examples/docs/zh-CN/datetime-picker.md index e2b18de51..e3d139d9b 100644 --- a/examples/docs/zh-CN/datetime-picker.md +++ b/examples/docs/zh-CN/datetime-picker.md @@ -253,10 +253,9 @@ | text | 标题文本 | string | — | — | | onClick | 选中后的回调函数,参数是 vm,可通过触发 'pick' 事件设置选择器的值。例如 vm.$emit('pick', new Date()) | function | — | — | - ### Events | Event Name | Description | Parameters | |---------|--------|---------| | change | 当 input 的值改变时触发,返回值和文本框一致 | formatted value | - - +| blur | 当 input 失去焦点时触发 | (event: Event) | +| focus | 当 input 获得焦点时触发 | (event: Event) | diff --git a/examples/docs/zh-CN/input-number.md b/examples/docs/zh-CN/input-number.md index cd9b09d68..cd0e8a251 100644 --- a/examples/docs/zh-CN/input-number.md +++ b/examples/docs/zh-CN/input-number.md @@ -137,3 +137,5 @@ | 事件名称 | 说明 | 回调参数 | |---------|--------|---------| | change | 绑定值被改变时触发 | 最后变更的值 | +| blur | 在组件 Input 失去焦点时触发 | (event: Event) | +| focus | 在组件 Input 获得焦点时触发 | (event: Event) | diff --git a/examples/docs/zh-CN/time-picker.md b/examples/docs/zh-CN/time-picker.md index 1f4c5d383..9bf5c6f59 100644 --- a/examples/docs/zh-CN/time-picker.md +++ b/examples/docs/zh-CN/time-picker.md @@ -176,11 +176,9 @@ | selectableRange | 可选时间段,例如`'18:30:00 - 20:30:00'`或者传入数组`['09:30:00 - 12:00:00', '14:30:00 - 18:30:00']` | string/array | — | — | | format | 时间格式化(TimePicker) | string | 小时:`HH`,分:`mm`,秒:`ss` | 'HH:mm:ss' | - ### Events | Event Name | Description | Parameters | |---------|--------|---------| | change | 当 input 的值改变时触发,返回值和文本框一致 | formatted value | - - - +| blur | 当 input 失去焦点时触发 | (event: Event) | +| focus | 当 input 获得焦点时触发 | (event: Event) | diff --git a/packages/autocomplete/src/autocomplete.vue b/packages/autocomplete/src/autocomplete.vue index 8b02949fb..0d8b61c09 100644 --- a/packages/autocomplete/src/autocomplete.vue +++ b/packages/autocomplete/src/autocomplete.vue @@ -14,6 +14,7 @@ @compositionend.native="handleComposition" @change="handleChange" @focus="handleFocus" + @blur="handleBlur" @keydown.up.native.prevent="highlight(highlightedIndex - 1)" @keydown.down.native.prevent="highlight(highlightedIndex + 1)" @keydown.enter.native.prevent="handleKeyEnter" @@ -129,12 +130,16 @@ } this.getData(value); }, - handleFocus() { + handleFocus(event) { this.activated = true; + this.$emit('focus', event); if (this.triggerOnFocus) { this.getData(this.value); } }, + handleBlur(event) { + this.$emit('blur', event); + }, close(e) { this.activated = false; }, diff --git a/packages/input-number/src/input-number.vue b/packages/input-number/src/input-number.vue index a21fa69f0..230c06202 100644 --- a/packages/input-number/src/input-number.vue +++ b/packages/input-number/src/input-number.vue @@ -27,6 +27,7 @@ @keydown.up.native.prevent="increase" @keydown.down.native.prevent="decrease" @blur="handleBlur" + @focus="handleFocus" @input="debounceHandleInput" :disabled="disabled" :size="size" @@ -175,9 +176,13 @@ if (newVal < this.min) return; this.setCurrentValue(newVal); }, - handleBlur() { + handleBlur(event) { + this.$emit('blur', event); this.$refs.input.setCurrentValue(this.currentValue); }, + handleFocus(event) { + this.$emit('focus', event); + }, setCurrentValue(newVal) { const oldVal = this.currentValue; if (newVal >= this.max) newVal = this.max; diff --git a/test/unit/specs/autocomplete.spec.js b/test/unit/specs/autocomplete.spec.js index 19bd2cde5..61081ab7e 100644 --- a/test/unit/specs/autocomplete.spec.js +++ b/test/unit/specs/autocomplete.spec.js @@ -384,4 +384,60 @@ describe('Autocomplete', () => { done(); }, 500); }); + it('event:focus & blur', done => { + vm = createVue({ + template: ` + + `, + data() { + return { + restaurants: [], + state: '' + }; + }, + methods: { + querySearch(queryString, cb) { + var restaurants = this.restaurants; + var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants; + cb(results); + }, + createFilter(queryString) { + return (restaurant) => { + return (restaurant.value.indexOf(queryString.toLowerCase()) === 0); + }; + }, + loadAll() { + return [ + { 'value': '三全鲜食(北新泾店)', 'address': '长宁区新渔路144号' }, + { 'value': 'Hot honey 首尔炸鸡(仙霞路)', 'address': '上海市长宁区淞虹路661号' }, + { 'value': '新旺角茶餐厅', 'address': '上海市普陀区真北路988号创邑金沙谷6号楼113' }, + { 'value': '泷千家(天山西路店)', 'address': '天山西路438号' } + ]; + } + }, + mounted() { + this.restaurants = this.loadAll(); + } + }, true); + + const spyFocus = sinon.spy(); + const spyBlur = sinon.spy(); + + vm.$refs.input.$on('focus', spyFocus); + vm.$refs.input.$on('blur', spyBlur); + vm.$el.querySelector('input').focus(); + vm.$el.querySelector('input').blur(); + + vm.$nextTick(_ => { + expect(spyFocus.calledOnce).to.be.true; + expect(spyBlur.calledOnce).to.be.true; + done(); + }); + }); }); diff --git a/test/unit/specs/date-picker.spec.js b/test/unit/specs/date-picker.spec.js index 2c163e20c..21b9413a6 100644 --- a/test/unit/specs/date-picker.spec.js +++ b/test/unit/specs/date-picker.spec.js @@ -316,6 +316,27 @@ describe('DatePicker', () => { }, DELAY); }); + it('work for event focus and blur', done => { + vm = createVue({ + template: ` + + ` + }, true); + + const spyFocus = sinon.spy(); + const spyBlur = sinon.spy(); + + vm.$refs.picker.$on('focus', spyFocus); + vm.$refs.picker.$on('blur', spyBlur); + vm.$el.querySelector('input').focus(); + vm.$el.querySelector('input').blur(); + + vm.$nextTick(_ => { + expect(spyFocus.calledOnce).to.be.true; + expect(spyBlur.calledOnce).to.be.true; + done(); + }); + }); }); it('default value', done => { diff --git a/test/unit/specs/input-number.spec.js b/test/unit/specs/input-number.spec.js index 9435e8a02..97eaa2fe6 100644 --- a/test/unit/specs/input-number.spec.js +++ b/test/unit/specs/input-number.spec.js @@ -289,4 +289,26 @@ describe('InputNumber', () => { done(); }); }); + it('event:focus & blur', done => { + vm = createVue({ + template: ` + + + ` + }, true); + + const spyFocus = sinon.spy(); + const spyBlur = sinon.spy(); + + vm.$refs.input.$on('focus', spyFocus); + vm.$refs.input.$on('blur', spyBlur); + vm.$el.querySelector('input').focus(); + vm.$el.querySelector('input').blur(); + + vm.$nextTick(_ => { + expect(spyFocus.calledOnce).to.be.true; + expect(spyBlur.calledOnce).to.be.true; + done(); + }); + }); }); diff --git a/test/unit/specs/time-picker.spec.js b/test/unit/specs/time-picker.spec.js index 3b553029d..d4025b4d2 100644 --- a/test/unit/specs/time-picker.spec.js +++ b/test/unit/specs/time-picker.spec.js @@ -1,4 +1,4 @@ -import { createTest, destroyVM } from '../util'; +import { createTest, destroyVM, createVue } from '../util'; import TimePicker from 'packages/time-picker'; import Vue from 'vue'; @@ -176,6 +176,32 @@ describe('TimePicker', () => { done(); }, 20); }); + + it('event focus and blur', done => { + vm = createVue({ + template: ` + + + ` + }, true); + + const spyFocus = sinon.spy(); + const spyBlur = sinon.spy(); + + vm.$refs.picker.$on('focus', spyFocus); + vm.$refs.picker.$on('blur', spyBlur); + vm.$el.querySelector('input').focus(); + vm.$el.querySelector('input').blur(); + + vm.$nextTick(_ => { + expect(spyFocus.calledOnce).to.be.true; + expect(spyBlur.calledOnce).to.be.true; + done(); + }); + }); }); describe('TimePicker(range)', () => { diff --git a/test/unit/specs/time-select.spec.js b/test/unit/specs/time-select.spec.js index 88eb71c47..006cb7c6c 100644 --- a/test/unit/specs/time-select.spec.js +++ b/test/unit/specs/time-select.spec.js @@ -198,4 +198,33 @@ describe('TimeSelect', () => { }, 50); }); + it('event focus and blur', done => { + vm = createVue({ + template: ` + + + ` + }, true); + + const spyFocus = sinon.spy(); + const spyBlur = sinon.spy(); + + vm.$refs.picker.$on('focus', spyFocus); + vm.$refs.picker.$on('blur', spyBlur); + vm.$el.querySelector('input').focus(); + vm.$el.querySelector('input').blur(); + + vm.$nextTick(_ => { + expect(spyFocus.calledOnce).to.be.true; + expect(spyBlur.calledOnce).to.be.true; + done(); + }); + }); });